• log4j.properties全配置 (转)


    ###############################log4j.properties###############################
    ##### Global Log Level(OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL) #############
    log4j.rootLogger=DEBUG,STDOUT,DB

    ###### STDOUT Logger ###############
    log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
    #输出目的Appender的日志级别,Appender的级别设置要优先于logger的
    #级别设置,即先使用Appender的,而不管logger的日志级别是怎样设置的
    log4j.appender.STDOUT.Threshold=DEBUG
    log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
    log4j.appender.STDOUT.layout.ConversionPattern=[%p] [%l] %10.10c - %m%n

    ###### File Logger ###############
    #开发时,使用DEBUG,发布时最好修改成INFO,如果未设置级别,则使用
    #父日志记录器的,设置了就使用logger的,不管父日志怎样设置
    log4j.logger.com.mypakge=DEBUG,FILELOGER
    #开发时设为true,表示需要屏幕输出,发布时这里最好设置为false,表示不继承父日志记录器的Appender
    log4j.additivity.com.mypakge=true
    log4j.appender.FILELOGER=org.apache.log4j.RollingFileAppender
    #设置日志输出编码方式为UTF-8,如果不指定,会以当前运行操作系统的编码方式记录,这样在有的Linux上会出面乱码
    log4j.appender.FILELOGER.encoding=UTF-8
    #${LOGS_PATH}为JVM环境变量,我们可以在运行里给JVM加上该参数 -DLOGS_PATH=e:/tmp/log
    log4j.appender.FILELOGER.File=${LOGS_PATH}/system.log
    log4j.appender.FILELOGER.MaxFileSize=1024KB
    log4j.appender.FILELOGER.MaxBackupIndex=10
    #文件采用追加方式
    log4j.appender.FILELOGER.Append=true
    log4j.appender.FILELOGER.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILELOGER.layout.ConversionPattern=[%d{yyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c] [%l] - [%m]%n

    ###### THREAD Logger ###############
    #线程日志一般记入到另一个文件,线程日志与主线程日志基本上没有什么逻辑关系
    log4j.logger.threadlogger=DEBUG,THREADLOGER
    log4j.additivity.threadlogger=true
    log4j.appender.THREADLOGER=org.apache.log4j.RollingFileAppender
    log4j.appender.THREADLOGER.encoding=UTF-8
    log4j.appender.THREADLOGER.File=${LOGS_PATH}/threadLog.log
    log4j.appender.THREADLOGER.MaxFileSize=2000KB
    log4j.appender.THREADLOGER.MaxBackupIndex=10
    log4j.appender.THREADLOGER.layout=org.apache.log4j.PatternLayout
    log4j.appender.THREADLOGER.layout.ConversionPattern=[%d{yyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c] [%l] - [%m]%n

    ###### SOCKET Logger ###############
    log4j.addivity.org.apache=true 
    log4j.appender.SOCKET=org.apache.log4j.net.SocketAppender
    #注,SocketAppender没有encoding属性,而接收日志的服务器端类org.apache.log4j.net.Socke
    #tServer也不能设置编码方式,这里在考虑他们在通信时是不是传递的对象,而不是传递的字符串呢?
    #log4j.appender.SOCKET.encoding=UTF-8
    log4j.appender.SOCKET.RemoteHost=localhost
    log4j.appender.SOCKET.Port=8089
    log4j.appender.SOCKET.LocationInfo=true
    log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
    #这里的格式配置不是很中要,好像不是要所这里的格式要输出那些消息,这里还是这个疑问就是在通信时是否是
    #传递的是序列化后的对象?因为服务器接收到消息后能以任何格式输出,可见传递的信息是完整的。~@!@#!哈
    #刚跟了一下org.apache.log4j.net.SocketAppender源码,在获取输出流的时候使用的是对象流,如下:
    #oos = new ObjectOutputStream(socket.getOutputStream());,这样就进一步证了我的想法,在
    #通信时时传递的是对象,所以就不存在字符编码的问题与客户端日志格式输出问题。
    log4j.appender.SOCKET.layout.ConversionPattern=%m

    ###### MAIL Logger ###############
    log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
    log4j.appender.MAIL.Threshold=ERROR
    log4j.appender.MAIL.BufferSize=10
    log4j.appender.MAIL.From=junJZ_2008@126.com
    log4j.appender.MAIL.SMTPHost=smtp.126.com
    #如果含有中文,则需使用native2asii log4j.properties log4jxx.properties 进行转换,否则乱码
    log4j.appender.MAIL.Subject=Log4Ju63D0u9192u60A8uFF1Au7CFBu7EDFu53D1u751Fu4E86u4E25u91CDu9519u8BEF
    log4j.appender.MAIL.To=junJZ_2008@163.com
    log4j.appender.MAIL.SMTPUsername=junJZ_2008@126.com
    log4j.appender.MAIL.SMTPPassword=XXX
    log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
    log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    ###### DB Logger ###############
    log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.DB.driver=com.mysql.jdbc.Driver
    log4j.appender.DB.URL=jdbc:mysql://127.0.0.1/test
    log4j.appender.DB.bufferSize=1
    log4j.appender.DB.user=root
    log4j.appender.DB.password=111111
    log4j.appender.DB.sql=insert into oplog (UserName,opttype,createTime,LogLevel,methodinfo,MSG) values ('%X{UserName}','%X{opttype}','%d{yyyy-MM-dd HH:mm:ss.SSS}','%p','%l','%m')    
    log4j.appender.DB.layout=org.apache.log4j.PatternLayout  

    配置日志服务器

    日志服务器的服务器端由以下类启动:
      log4j jar包中的org.apache.log4j.net.SocketServer 
     三个参数 【监听端口】【日志服务器配置文件】【客户端配置文件目录】
      第三个参数【配置文件目录】其实指的是针对每个客户端的配置文件,名命规则为 "客户端IP.lcf"

    基本原理

    当日志保存请求发过来时,服务器会根据客户端的IP去在指定的目录(上面第三个参数)下搜索各自的配置文件,如果没有找到的话,再找是否配置了公用的客户端日志配置文件 generic.lcf,如果也没有配置的话,它将日志与服务器运行日志记录在同一文件中(这里为server.log),如果找到了,会把收到的日志按照配置文件要求记录,我在这 里使用的客户端配置文件与log4j.properties是一样的,所以这里会产生与客户机保存的日志是一样的。

     

    在运行前还得要修改一下 org.apache.log4j.net.SocketServer 这个类,这个类在取客户端时有问题,网上其他人也这么认为(我使用的是1.215版本),找到 String key = s.substring(0, i); 这一行,修改成 String key = s.substring(i + 1); 即可,然后把修改好的class放入log4j-1.2.15.jar包中(后面附上修改好的包)。

    socketserver.properties

    #文件名socketserver.properties
    #如果需要显示日志界面,可以将本行启用
    log4j.rootCategory=, A1 
    log4j.rootLogger=DEBUG,A3,STDOUT
    log4j.category.org.apache.log4j.net=INFO
    
    log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
    log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
    log4j.appender.STDOUT.layout.ConversionPattern=[%p] [%l] %10.10c - %m%n
    
    log4j.appender.A1=org.apache.log4j.lf5.LF5Appender
    log4j.appender.A1.MaxNumberOfRecords=700
    
    log4j.appender.A3=org.apache.log4j.RollingFileAppender
    log4j.appender.A3.file=${LOGS_PATH}/server.log
    log4j.appender.A3.MaxFileSize=1024KB
    log4j.appender.A3.MaxBackupIndex=10
    log4j.appender.A3.layout=org.apache.log4j.PatternLayout
    log4j.appender.A3.layout.ConversionPattern=
    
    [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

    客户端配置文件 127.0.0.1.lcf

    ###############################log4j.properties###############################
    ##### Global Log Level(OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL) #############
    log4j.rootLogger=DEBUG,FILELOGER
    
    ###### File Logger ###############
    #开发时,使用DEBUG,发布时最好修改成INFO,如果未设置级别,则使用
    #父日志记录器的,设置了就使用logger的,不管父日志怎样设置
    log4j.logger.com.mypakge=DEBUG,FILELOGER
    #开发时设为true,表示需要屏幕输出,发布时这里最好设置为false,表示不继承父日志记录器的Appender
    log4j.additivity.com.mypakge=true
    log4j.appender.FILELOGER=org.apache.log4j.RollingFileAppender
    #设置日志输出编码方式为UTF-8,如果不指定,会以当前运行操作系统的编码方式记录,这样在有的Linux上会出面乱码
    log4j.appender.FILELOGER.encoding=UTF-8
    #${LOGS_PATH}为JVM环境变量,我们可以在运行里给JVM加上该参数 -DLOGS_PATH=e:/tmp/log
    log4j.appender.FILELOGER.File=${LOGS_PATH}/client.log
    log4j.appender.FILELOGER.MaxFileSize=1024KB
    log4j.appender.FILELOGER.MaxBackupIndex=10
    #文件采用追加方式
    log4j.appender.FILELOGER.Append=true
    log4j.appender.FILELOGER.layout=org.apache.log4j.PatternLayout
    log4j.appender.FILELOGER.layout.ConversionPattern=[%d{yyy-MM-dd HH:mm:ss.SSS}] [%p] [%t] [%c] [%l] - [%m]%n 
    

    启动:

    java -classpath log4j-1.2.15.jar -DLOGS_PATH=e:/tmp/sverlog o
    rg.apache.log4j.net.SocketServer 8089 socketserver.properties .

     

    现在使用一个测试类记录日志时,它会往日志服务器发送日志事件,服务器会根据服务器端配置的客户端配置文件记录日志。

     

    配置邮件日志

    由于刚开始使用1.2.9版本的包时 org.apache.log4j.net.SMTPAppender 发送邮件时不支持用户鉴权操作,而有的邮件服务器在发送时需要先登录后再发送,所以换用了1.2.15的包,SMTPAppender类支持SMTPUsername与SMTPPassword两个鉴权参数,这样就可以发送日志邮件了,具体配置参见文章开头。

     

    配置数据库日志

    创建表:

     

    create table oplog(
        UserName varchar(20),
        opttype varchar(20),
        createTime varchar(30),
        LogLevel varchar(20),
        methodinfo varchar(100),
        MSG varchar(1024),
        primary key (createTime)
    )


    表中的 UserName 与 opttype 表示用户名与操作类型,插入数据时使用 MDC 类进行预先设置,且配置文件中使用 %x{XXX} 来引用, MDC其实就是Java里的ThreadLocal类的派生类。

     

    测试代码:

     

    Java代码     收藏代码
    1. import org.apache.commons.logging.Log;  
    2. import org.apache.commons.logging.LogFactory;  
    3. import org.apache.log4j.MDC;  
    4.   
    5. public class TestLog {  
    6.     private static Log log = LogFactory.getLog(TestLog.class);  
    7.   
    8.     public void log() {  
    9.         log.debug("Debug info.");  
    10.         log.info("Info info");  
    11.         log.warn("Warn info");  
    12.         log.error("Error info");  
    13.         log.fatal("Fatal info");  
    14.     }  
    15.   
    16.     public static void main(String[] args) {  
    17.         MDC.put("UserName""jzj");  
    18.         MDC.put("opttype""delete");  
    19.         TestLog test = new TestLog();  
    20.         test.log();  
    21.     }  
    22. }  
  • 相关阅读:
    jmeter主要函数助手功用说明
    性能测试的分类
    monkey基础
    读《复盘-对过去的事情做思维演练—陈中(著)》感知
    关于postman各功能的说明及用法以及批量执行
    python接口测试-认识POST请求
    关于python3.6上传文件时报错:HTTPSConnectionPool(host='***.org', port=443): Max retries exceeded with url: /post (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAIL解决办法
    [Tips] Mobaxterm添加本地python使用
    [Tips] docker run时运行shell命令
    [Tips] shell 输入输出重定向
  • 原文地址:https://www.cnblogs.com/fibonaccixue/p/6172045.html
Copyright © 2020-2023  润新知