zoukankan      html  css  js  c++  java
  • Spark log4j日志配置详解(转载)

    一、spark job日志介绍
        spark中提供了log4j的方式记录日志。可以在$SPARK_HOME/conf/下,将 log4j.properties.template 文件copy为 log4j.properties 来启用log4j配置。但这个配置为全局配置,不能单独配置某个job的运行日志。
        在Spark的conf目录下,把log4j.properties.template修改为log4j.properties,原来的内容如下:(log4j的用法和配置,请参考另一篇文档)

    # Set everything to be logged to the console
    log4j.rootCategory=INFO, console
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.target=System.err
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
    
    # Set the default spark-shell log level to WARN. When running the spark-shell, the
    # log level for this class is used to overwrite the root logger's log level, so that
    # the user can have different defaults for the shell and regular Spark apps.
    log4j.logger.org.apache.spark.repl.Main=WARN
    
    # Settings to quiet third party logs that are too verbose
    log4j.logger.org.spark_project.jetty=WARN
    log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
    log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
    log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
    log4j.logger.org.apache.parquet=ERROR
    log4j.logger.parquet=ERROR
    
    # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
    log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
    log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR

    二、spark job独立配置的log4j的方法
        现在我们介绍spark (streaming) job独立配置的log4j的方法,通过查看官方文档,要为应用主程序(即driver端)或执行程序使(即executor端)自定义log4j配置,需要两步就完成了,下面具体说明。
        第一步:上传自定义 log4j-driver.properties和log4j-executor.properties
        第二步:添加-Dlog4j的配置。使用 --conf参数。
            用于驱动程序:spark.driver.extraJavaOptions = -Dlog4j.configuration = <配置文件的位置>
            用于执行者:spark.executor.extraJavaOptions= -Dlog4j.configuration = <配置文件的位置>
            注意:driver端还可以使用spark-submit的--driver-java-options参数去配置。
        方案一:使用  spark-submit的 --files 参数将自定义的配置文件上传到应用程序的文件列表中。

    spark-submit 
    --class com.hm.spark.Application 
    --master yarn --deploy-mode cluster 
    --driver-cores 1 --driver-memory 1G 
    --num-executors 2 --executor-cores 1 --executor-memory 1G 
    --driver-java-options "-Dlog4j.configuration=log4j-driver.properties" 
    --conf spark.executor.extraJavaOptions="-Dlog4j.configuration=log4j-executor.properties" 
    --files /home/hadoop/spark-workspace/log4j-driver.properties,/home/hadoop/spark-workspace/log4j-executor.properties 
    /home/hadoop/spark-workspace/my-spark-etl-assembly-1.0-SNAPSHOT.jar

     注意,这里我没有使用spark.driver.extraJavaOptions参数去配置,而是使用spark-submit的--driver-java-options参数进行设置的。
        方案二:不使用  spark-submit的 --files 参数上传文件,直接使用文件。

    spark-submit 
    --class com.hm.spark.Application 
    --master yarn --deploy-mode cluster 
    --driver-cores 1 --driver-memory 1G 
    --num-executors 2 --executor-cores 1 --executor-memory 1G 
    --driver-java-options "-Dlog4j.configuration=file:/home/hadoop/spark-workspace/log4j-driver.properties " 
    --conf spark.executor.extraJavaOptions="-Dlog4j.configuration=file:/home/hadoop/spark-workspace/log4j-executor.properties" 
    /home/hadoop/spark-workspace/my-spark-etl-assembly-1.0-SNAPSHOT.jar

    注意:如果使用文件,  file: 则应明确提供配置文件的,并且文件需要在所有节点上本地存在。

    在shell脚本中写的格式

    #!/bin/bash
     
    base_path=/data/service/spark-workspace
    version=1.0-SNAPSHOT
    jar_name=spark-etl_2.11-${version}-assembly.jar
    class_name=com.spark.etl.Application
    # client or cluster
    deploy_mode=cluster
    cmd="spark-submit --class ${class_name} --master yarn --deploy-mode ${deploy_mode} --driver-cores 1 --driver-memory 2G --num-executors 4 --executor-cores 2 --executor-memory 4G --driver-java-options "-Dlog4j.configuration=log4j-driver.properties" --conf spark.executor.extraJavaOptions="-Dlog4j.configuration=log4j-executor.properties" --files ${base_path}/log4j-executor.properties,${base_path}/log4j-driver.properties ${base_path}/${jar_name}"
    echo "${cmd}"

    需要注意的是--conf 后的配置项不能用加双引号,但是参数值必须用双引号括起来,“”是shell脚本的转义符。本人遇到的问题,之前在--conf后的配置项添加了引号,如下

     --conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=log4j-executor.properties" 

    这样在不写入shell脚本中,直接在命令行中输入,是没有问题的,executor中的日志可以收集,如果在shell脚本中这样写,那executor是收集不到日志,因为该参数不起效果,通过我多次测试,千万注意,在写入shell脚本中,--conf 后配置项千万不能加双引号。

    三、spark job的日志输出到指定文件
        在测试spark计算时,将作业提交到yarn(模式–master yarn-cluster)上,想查看print到控制台这是绝对不可能的,因为作业是提交到yarn的集群上,所以去yarn集群上看日志是很麻烦的,但有特别想看下print的信息,方便调试或者别的目的
        在Spark的conf目录下,把log4j.properties.template修改为log4j.properties。

    # Set everything to be logged to the console
    log4j.rootCategory=INFO, console
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.target=System.err
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
    
    # Set the default spark-shell log level to WARN. When running the spark-shell, the
    # log level for this class is used to overwrite the root logger's log level, so that
    # the user can have different defaults for the shell and regular Spark apps.
    log4j.logger.org.apache.spark.repl.Main=WARN
    
    # Settings to quiet third party logs that are too verbose
    log4j.logger.org.spark_project.jetty=WARN
    log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
    log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
    log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
    log4j.logger.org.apache.parquet=ERROR
    log4j.logger.parquet=ERROR
    
    # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
    log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
    log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR

      把log4j.rootCategory=INFO, console改为log4j.rootCategory=WARN, console即可抑制Spark把INFO级别的日志打到控制台上。如果要显示全面的信息,则把INFO改为DEBUG。
        如果希望一方面把代码中的println打印到控制台,另一方面又保留spark 本身输出的日志,可以将它输出到日志文件中
        配置内容如下:

    # Set everything to be logged to the console
    log4j.rootCategory=INFO, console, FILE
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.target=System.err
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
    
    # Set the default spark-shell log level to WARN. When running the spark-shell, the
    # log level for this class is used to overwrite the root logger's log level, so that
    # the user can have different defaults for the shell and regular Spark apps.
    log4j.logger.org.apache.spark.repl.Main=WARN
    
    # Settings to quiet third party logs that are too verbose
    log4j.logger.org.spark_project.jetty=WARN
    log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
    log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
    log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
    log4j.logger.org.apache.parquet=ERROR
    log4j.logger.parquet=ERROR
    
    # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
    log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
    log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
    
    log4j.appender.FILE=org.apache.log4j.FileAppender
    log4j.appender.FILE.Threshold=DEBUG
    log4j.appender.FILE.file=/home/hadoop/spark.log
    log4j.appender.logFile.Encoding = UTF-8
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILE.layout.ConversionPattern=[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n
    # spark只对com.ha.spark下的程序进行日志优先级DEBUG输出,其它包遵循全局日志级别INFO 
    log4j.logger.com.ha.spark=DEBUG

       上面的操作,spark的日志一方面打印到控制台,一方面写入到/home/hadoop/spark.log中了,这是日志的继承特性,这样有个弊端假设现在我们把产品已经部署完成,设置好FileAppender和INFO,日志就慢慢的在文件中记录着。突然有一天,我们想要查看一下日志文件了,可能会发现问题:日志文件可能已经非常庞大了,打开非常缓慢,而且文件越大,做日志的速度会越来越慢。所以我们要使用RollingFileAppender或者DailyRollingFileAppender
        首先,RollingFileAppender也能够将日志记录到文件中,并且可以当一个文件到达了指定大小后,把这个日志文件备份并重开一个日志文件。RollingFileAppender是继承自FileAppender,所以FileAppender那些配置项仍然能够使用。使用RollingFileAppender虽然可以将文件大小控制在一定的范围内,但是还是会造成一些问题:1,文件命名没有规律,可能会造成某一段时间的日志分散在两个日志文件中,2,从文件名中很难定位具体的日志信息。在真实的产品中,我们要监控日志,往往需要定位到某个具体的时间段里面的日志信息,使用RollingFileAppender就很难做到。Log4J也想到了这点,提供了DailyRollingFileAppender。

    四、spark job的日志和Yarn日志进行聚合
        如果您需要spark的日志文件放入YARN中,以便YARN可以正确显示并聚合它们,则 在log4j.properties日志配置文件中设置 spark.yarn.app.container.log.dir 
        例如,  log4j.appender.File.file=${spark.yarn.app.container.log.dir}/spark-driver.log
        对于流式应用程序则还应该RollingFileAppender和 DailyRollingFileAppender设定文件大小输出到文件, 将避免YARN的日志目录由大型日志文件引起的磁盘溢出,并且可以使用YARN的日志程序访问日志。
        配置如下:

    # Set everything to be logged to the console
    log4j.rootCategory=INFO, console, FILE
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.target=System.err
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n
    
    # Set the default spark-shell log level to WARN. When running the spark-shell, the
    # log level for this class is used to overwrite the root logger's log level, so that
    # the user can have different defaults for the shell and regular Spark apps.
    log4j.logger.org.apache.spark.repl.Main=WARN
    
    # Settings to quiet third party logs that are too verbose
    log4j.logger.org.spark_project.jetty=WARN
    log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR
    log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
    log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
    log4j.logger.org.apache.parquet=ERROR
    log4j.logger.parquet=ERROR
    
    # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
    log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
    log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR
    
    log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppende
    log4j.appender.FILE.Threshold=DEBUG
    log4j.appender.File.file=${spark.yarn.app.container.log.dir}/spark-driver.log
    log4j.appender.FILE.DatePattern='.'yyyy-MM-dd
    log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILE.layout.ConversionPattern=[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%C{1}:%M:%L] %m%n
    # spark  只对com.ha.spark下的程序进行日志优先级DEBUG输出,其它包遵循全局日志级别INFO  
    log4j.logger.com.ha.spark=DEBUG

       DailyRollingFileAppender是日志记录软件包Log4J中的一个Appender,它能够按一定的频度滚动日志记录文件。

        日志文件为: spark-driver.log-2010-01-01 , spark-driver.log-2010-01-02

        在DailyRollingFileAppender中可以指定monthly(每月)、weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小时)和minutely(每分钟)六个频度,这是通过为 DatePattern选项赋予不同的值来完成的。DatePattern选项的有效值为:

    * ‘.’yyyy-MM,对应monthly(每月)                   
    * ‘.’yyyy-ww,对应weekly(每周)
    * ‘.’yyyy-MM-dd,对应daily(每天)
    * ‘.’yyyy-MM-dd-a,对应half-daily(每半天)
    * ‘.’yyyy-MM-dd-HH,对应hourly(每小时)
    * ‘.’yyyy-MM-dd-HH-mm,对应minutely(每分钟)
        DatePattern中不用处理的文字要放到单引号(‘)中,如上面的(.)。
        DatePattern格式化之后的文本作为文件名字的后缀。DailyRollingFileAppender不支持格式化之后的文本作为文件名字的前缀。
        DailyRollingFileAppender在每一个日志事件(LoggingEvent)附加(append)之前检查是否需要附加。也就是说如果在一个滚动区间中没有任何日志记录,那么这个区间的日志记录文件就不会形成。

    五、spark log4j.properties配置详解与实例(摘录于铭霏的记事本)

    ################################################################################ 
    #①配置根Logger,其语法为: 
    # 
    #log4j.rootLogger = [level],appenderName,appenderName2,... 
    #level是日志记录的优先级,分为OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL 
    ##Log4j建议只使用四个级别,优先级从低到高分别是DEBUG,INFO,WARN,ERROR 
    #通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关 
    #比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来 
    #appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的 
    ################################################################################ 
    ################################################################################ 
    #②配置日志信息输出目的地Appender,其语法为: 
    # 
    #log4j.appender.appenderName = fully.qualified.name.of.appender.class 
    #log4j.appender.appenderName.optionN = valueN 
    # 
    #Log4j提供的appender有以下几种: 
    #1)org.apache.log4j.ConsoleAppender(输出到控制台) 
    #2)org.apache.log4j.FileAppender(输出到文件) 
    #3)org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) 
    #4)org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) 
    #5)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 
    # 
    #1)ConsoleAppender选项属性 
    # -Threshold = DEBUG:指定日志消息的输出最低层次 
    # -ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出 
    # -Target = System.err:默认值System.out,输出到控制台(err为红色,out为黑色) 
    # 
    #2)FileAppender选项属性 
    # -Threshold = INFO:指定日志消息的输出最低层次 
    # -ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出 
    # -File = C:log4j.log:指定消息输出到C:log4j.log文件 
    # -Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容 
    # -Encoding = UTF-8:可以指定文件编码格式 
    # 
    #3)DailyRollingFileAppender选项属性 
    # -Threshold = WARN:指定日志消息的输出最低层次 
    # -ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出 
    # -File = C:log4j.log:指定消息输出到C:log4j.log文件 
    # -Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容 
    # -DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。还可以按用以下参数: 
    #              '.'yyyy-MM:每月 
    #              '.'yyyy-ww:每周 
    #              '.'yyyy-MM-dd:每天 
    #              '.'yyyy-MM-dd-a:每天两次 
    #              '.'yyyy-MM-dd-HH:每小时 
    #              '.'yyyy-MM-dd-HH-mm:每分钟 
    # -Encoding = UTF-8:可以指定文件编码格式 
    # 
    #4)RollingFileAppender选项属性 
    # -Threshold = ERROR:指定日志消息的输出最低层次 
    # -ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出 
    # -File = C:/log4j.log:指定消息输出到C:/log4j.log文件 
    # -Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容 
    # -MaxFileSize = 100KB:后缀可以是KB,MB,GB.在日志文件到达该大小时,将会自动滚动.如:log4j.log.1 
    # -MaxBackupIndex = 2:指定可以产生的滚动文件的最大数 
    # -Encoding = UTF-8:可以指定文件编码格式 
    ################################################################################ 
    ################################################################################ 
    #③配置日志信息的格式(布局),其语法为: 
    # 
    #log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
    #log4j.appender.appenderName.layout.optionN = valueN 
    # 
    #Log4j提供的layout有以下几种: 
    #5)org.apache.log4j.HTMLLayout(以HTML表格形式布局) 
    #6)org.apache.log4j.PatternLayout(可以灵活地指定布局模式) 
    #7)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) 
    #8)org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 
    #9)org.apache.log4j.xml.XMLLayout(以XML形式布局) 
    # 
    #5)HTMLLayout选项属性 
    # -LocationInfo = TRUE:默认值false,输出java文件名称和行号 
    # -Title=Struts Log Message:默认值 Log4J Log Messages 
    # 
    #6)PatternLayout选项属性 
    # -ConversionPattern = %m%n:格式化指定的消息(参数意思下面有) 
    # 
    #9)XMLLayout选项属性 
    # -LocationInfo = TRUE:默认值false,输出java文件名称和行号 
    # 
    #Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: 
    # %m 输出代码中指定的消息 
    # %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
    # %r 输出自应用启动到输出该log信息耗费的毫秒数 
    # %c 输出所属的类目,通常就是所在类的全名 
    # %t 输出产生该日志事件的线程名 
    # %n 输出一个回车换行符,Windows平台为“
    ”,Unix平台为“
    ” 
    # %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式 
    #    如:%d{yyyy年MM月dd日 HH:mm:ss,SSS},输出类似:2012年01月05日 22:10:28,921 
    # %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 
    #    如:Testlog.main(TestLog.java:10) 
    # %F 输出日志消息产生时所在的文件名称 
    # %L 输出代码中的行号 
    # %x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中 
    # %% 输出一个"%"字符 
    # 
    # 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 
    #  %5c: 输出category名称,最小宽度是5,category<5,默认的情况下右对齐 
    #  %-5c:输出category名称,最小宽度是5,category<5"-"号指定左对齐,会有空格 
    #  %.5c:输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格 
    #  %20.30c:category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉 
    ################################################################################ 
    ################################################################################ 
    #④指定特定包的输出特定的级别 
    #log4j.logger.org.springframework=DEBUG 
    ################################################################################ 
    
    
    #OFF,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB,ALL 
    log4j.rootLogger =ALL,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB 
    
    
    #输出到控制台 
    log4j.appender.systemOut = org.apache.log4j.ConsoleAppender 
    log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout 
    log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
    log4j.appender.systemOut.Threshold = DEBUG 
    log4j.appender.systemOut.ImmediateFlush = TRUE 
    log4j.appender.systemOut.Target = System.out 
    
    
    #输出到文件 
    log4j.appender.logFile = org.apache.log4j.FileAppender 
    log4j.appender.logFile.layout = org.apache.log4j.PatternLayout 
    log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
    log4j.appender.logFile.Threshold = DEBUG 
    log4j.appender.logFile.ImmediateFlush = TRUE 
    log4j.appender.logFile.Append = TRUE 
    log4j.appender.logFile.File = ../Struts2/WebRoot/log/File/log4j_Struts.log 
    log4j.appender.logFile.Encoding = UTF-8 
    
    
    #按DatePattern输出到文件 
    log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender 
    log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout 
    log4j.appender.logDailyFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
    log4j.appender.logDailyFile.Threshold = DEBUG 
    log4j.appender.logDailyFile.ImmediateFlush = TRUE 
    log4j.appender.logDailyFile.Append = TRUE 
    log4j.appender.logDailyFile.File = ../Struts2/WebRoot/log/DailyFile/log4j_Struts 
    log4j.appender.logDailyFile.DatePattern = '.'yyyy-MM-dd-HH-mm'.log' 
    log4j.appender.logDailyFile.Encoding = UTF-8 
    
    
    #设定文件大小输出到文件 
    log4j.appender.logRollingFile = org.apache.log4j.RollingFileAppender 
    log4j.appender.logRollingFile.layout = org.apache.log4j.PatternLayout 
    log4j.appender.logRollingFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
    log4j.appender.logRollingFile.Threshold = DEBUG 
    log4j.appender.logRollingFile.ImmediateFlush = TRUE 
    log4j.appender.logRollingFile.Append = TRUE 
    log4j.appender.logRollingFile.File = ../Struts2/WebRoot/log/RollingFile/log4j_Struts.log 
    log4j.appender.logRollingFile.MaxFileSize = 1MB 
    log4j.appender.logRollingFile.MaxBackupIndex = 10 
    log4j.appender.logRollingFile.Encoding = UTF-8 
    
    
    #用Email发送日志 
    log4j.appender.logMail = org.apache.log4j.net.SMTPAppender 
    log4j.appender.logMail.layout = org.apache.log4j.HTMLLayout 
    log4j.appender.logMail.layout.LocationInfo = TRUE 
    log4j.appender.logMail.layout.Title = Struts2 Mail LogFile 
    log4j.appender.logMail.Threshold = DEBUG 
    log4j.appender.logMail.SMTPDebug = FALSE 
    log4j.appender.logMail.SMTPHost = SMTP.163.com 
    log4j.appender.logMail.From = xly3000@163.com 
    log4j.appender.logMail.To = xly3000@gmail.com 
    #log4j.appender.logMail.Cc = xly3000@gmail.com 
    #log4j.appender.logMail.Bcc = xly3000@gmail.com 
    log4j.appender.logMail.SMTPUsername = xly3000 
    log4j.appender.logMail.SMTPPassword = 1234567 
    log4j.appender.logMail.Subject = Log4j Log Messages 
    #log4j.appender.logMail.BufferSize = 1024 
    #log4j.appender.logMail.SMTPAuth = TRUE 
    
    
    #将日志登录到MySQL数据库 
    log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender 
    log4j.appender.logDB.layout = org.apache.log4j.PatternLayout 
    log4j.appender.logDB.Driver = com.mysql.jdbc.Driver 
    log4j.appender.logDB.URL = jdbc:mysql://127.0.0.1:3306/xly 
    log4j.appender.logDB.User = root 
    log4j.appender.logDB.Password = 123456 
    log4j.appender.logDB.Sql = INSERT INTOT_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('Struts2','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')
  • 相关阅读:
    CDH 2、Cloudera Manager的安装
    204 01 Android 零基础入门 03 Java常用工具类 04 Java集合 04 Map集合 01 Map概述
    203 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 07 删除宠物猫信息数据(引入泛型知识点)
    202 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 06 查找宠物猫信息数据
    201 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 05 添加重复的宠物猫信息数据
    200 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 04 添加和显式宠物猫信息
    199 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 03 宠物猫信息管理概述
    198 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 02 案例:在集合中插入字符串
    197 01 Android 零基础入门 03 Java常用工具类 04 Java集合 03 Set集合 01 Set概述
    196 01 Android 零基础入门 03 Java常用工具类 04 Java集合 02 List集合 05 案例:公告的删除和修改
  • 原文地址:https://www.cnblogs.com/itboys/p/10370304.html
Copyright © 2011-2022 走看看