• 关于log4j的配置文件


    因为要在spring中添加Mongodb,在网上查阅资料的时候我发现有人在web.xml中添加如下代码:

    1. <context-param>
    2.       <param-name>log4jConfigLocation</param-name>
    3.       <param-value>classpath:config/properties/log4j.properties</param-value>
    4.    </context-param>
    5.  
    6.    <listener>
    7.       <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    8.    </listener>

    可以定义log4j的配置文件的路径。

    因为我向来是把这个文件放在src下的。这种可配置的做法让我迷惑:

    这种可配置的做法依赖于web.xml,那么也就是说只有web项目才能使用。而且要配置springframework下的一个Log4jConfigListener。所以这种做法更加奇怪。

    我尝试在src下和classpath:config/properties/下都放了log4j.properties文件,但是log文件的输出路径不同。结果系统启动的时候会在两个位置都创建log文件。不过,最后经过我的验证,只有web.xml中配置的log文件会打印出内容,另外一个log文件甚至不是"占用"状态,可以删除不会报错。

    后来我把web.xml中的这段配置删除,src下的配置的log文件就开始生效,保持占用状态,可以输出错误日志。

    后来我翻了spring的源代码,发现spring只是从web.xml中取出了配置的路径,然后调用了log4j的代码,设置给了log4g配置文件的路径而已。摘出部分代码如下:

    1. import org.apache.log4j.LogManager;
    2. import org.apache.log4j.PropertyConfigurator;
    3. import org.apache.log4j.xml.DOMConfigurator;
    4.  
    5.  
    6. public static void initLogging(String location) throws FileNotFoundException {
    7.       String resolvedLocation = SystemPropertyUtils.resolvePlaceholders(location);
    8.       URL url = ResourceUtils.getURL(resolvedLocation);
    9.       if (ResourceUtils.URL_PROTOCOL_FILE.equals(url.getProtocol()) && !ResourceUtils.getFile(url).exists()) {
    10.          throw new FileNotFoundException("Log4j config file [" + resolvedLocation + "] not found");
    11.       }
    12.  
    13.       if (resolvedLocation.toLowerCase().endsWith(XML_FILE_EXTENSION)) {
    14.          DOMConfigurator.configure(url);
    15.       }
    16.       else {
    17.          PropertyConfigurator.configure(url);
    18.       }
    19.    }

    最终我的结论是,web.xml中配置的路径将优先生效,并发挥作用。

    在整个过程中,还有一个经验是,如果log4g.properties的内容有错误,那么在启动的时候,会报和没有配置log4g. properties文件一样的错误:

    1. log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).
    2. log4j:WARN Please initialize the log4j system properly.
    3. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

    所以一旦有这个错误,可能并不是你的配置文件的位置不对,而是你的配置文件的内容有问题。

    一个简单的log4j.properties文件的内容如下:

    1. log4j.rootLogger = ERROR,C1
    2.  
    3. #logger
    4. log4j.logger.com.zjf =DEBUG,F1
    5. log4j.additivity.com.zjf =false
    6. #u5E94u7528u4E8Eu63A7u5236u53F0
    7. log4j.appender.C1=org.apache.log4j.ConsoleAppender
    8. #log4j.appender.C1.Threshold=WARNING
    9. log4j.appender.C1.Target=System.out
    10. #log4j.appender.C1.Encoding=UTF-8
    11. log4j.appender.C1.layout=org.apache.log4j.PatternLayout
    12. log4j.appender.C1.layout.ConversionPattern=[CONSOLE] %d - %c -%-4r [%t] %-5p %c %x - %m%n
    13.  
    14. #u6BCFu5929u5EFAu65B0u65E5u5FD7
    15. log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
    16. log4j.appender.A1.File=E:\log\log4j_daily.log
    17. #log4j.appender.A1.Encoding=UTF-8
    18. #log4j.appender.A1.Threshold=DEBUG
    19. log4j.appender.A1.DatePattern=.yyyy-MM-dd
    20. log4j.appender.A1.layout=org.apache.log4j.PatternLayout
    21. log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n
    22.  
    23. #u5E94u7528u4E8Eu6587u4EF6
    24. log4j.appender.F1=org.apache.log4j.FileAppender
    25. log4j.appender.F1.File=E:\log\Spring.log
    26. log4j.appender.F1.Append=true
    27. #log4j.appender.F1.Threshold=DEBUG
    28. #log4j.appender.F1.Encoding=UTF-8
    29. log4j.appender.F1.layout=org.apache.log4j.PatternLayout
    30. log4j.appender.F1.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

    appender的内容是一个类,整个类都实现了org.apache.log4j.Appender接口,有以下几种:

    •org.apache.log4j.ConsoleAppender(控制台), 
    •org.apache.log4j.FileAppender(文件), 
    •org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
    •org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) 
    •org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    Appender的配置要么是它对象的类的一个属性(有get方法),要么是对应的一个类。

    如:

    1. //定义C1为ConsoleAppender 输出到控制台
    2. log4j.appender.C1=org.apache.log4j.ConsoleAppender
    3. //以下都是ConsoleAppender的属性
    4. log4j.appender.C1.Threshold=WARNING
    5. log4j.appender.C1.Target=System.out
    6. log4j.appender.C1.Encoding=UTF-8
    7. // layout描述输出格式 PatternLayout是一个实现类
    8. log4j.appender.C1.layout=org.apache.log4j.PatternLayout
    9. //这个是PatternLayout的属性
    10. log4j.appender.C1.layout.ConversionPattern=[CONSOLE] %d - %c -%-4r [%t] %-5p %c %x - %m%n

     

    Log4j提供的layout有以下几种:

    •org.apache.log4j.HTMLLayout(以HTML表格形式布局), 
    •org.apache.log4j.PatternLayout(可以灵活地指定布局模式), 
    •org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    •org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

     

    Log4j提供的level有:

    OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别。Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。

    关于rootLogger  :

    log4j.rootLogger   =   [   level   ]   ,   appenderName,   appenderName,   … 

     

    rootLogger 和 rootCategory是同义词,或者说Category和Logger是同义词。原始的叫法是Category,后来为了与jdk1.4的日志功能保持一致,改为叫Logger。

    关于logger的树状层级:

    如果存在这样几个logger:

    log4j.rootLogger = ERROR,A1

    log4j.logger.x = INFO,A2

    log4j.logger.x.y= INFO,A3

    这三个logger是一个从上到下的树状结构,下面的节点会自动从上面的节点继承Appender,而不继承Level,上面的三个等效于:

    log4j.rootLogger = ERROR,A1

    log4j.logger.x = INFO,A1,,A2

    log4j.logger.x.y= INFO,A1,A2,A3

    如果要拒绝这种集成,可以设置additivity为false,如下:

    log4j.rootLogger = ERROR,A1

    log4j.logger.x = INFO,A2

    log4j. additivity.x =false

    log4j.logger.x.y= INFO,A3

    这样log4j.logger.x将不再继承A1, log4j.logger.x.y从log4j.logger.x继承,也将没有A1。

     

    对于logger的这种树状结构,当遇到日志记录时,将会根据Logger所在的包的路径进行匹配,从Logger树的叶子结点网上匹配配置的所有Logger,遇到第一个匹配(也就是最长的包路径匹配)就停止,不再往上走了。然后根据这个匹配的Logger(这个Logger也可能会从父Logger继承Appender)来进行输出。

  • 相关阅读:
    redux VS mobx (装饰器配合使用)
    react-native 中使用 mobx
    使用 react-native-tab-navigator 创建 TabBar 组件
    react-native ListView 封装 实现 下拉刷新/上拉加载更多
    react-native 路由 react-native-router-flux
    react-native fetch 请求封装
    react-native flex 布局 详解
    react-native AsyncStorage 数据持久化方案
    react-native 自定义 下拉刷新 / 上拉加载更多 组件
    用 Core Animation 实现图片的碎片化
  • 原文地址:https://www.cnblogs.com/xiaolang8762400/p/6941540.html
Copyright © 2020-2023  润新知