• Log4j写日志文件使用详解


    Log4j输出到控制台成功,写入文件失败 - Log4j和commons log的整合

    一、今天在使用commongs-logging.jar和log4j.properties来输出系统日志的时候,发现日志能够成功的输出到控制台,但是去不能写到目的文件中,具体的步骤和原因如下:

    1. 只在项目中引入commons-logging.jar

    commons-logging.jar 使用 Log logger = LogFactory.getLogger(XXX.class), 如果有log4j.properties,并且在

    log4j.properties中配置了日志输出到控制台和文件(如将日志输出到C:logsx.log),如果此时项目的lib中没有log4j.jar,

    则日志能够成功输出到控制台上,但是不会生成log目录和文件,即不会生成C:logsx.log.

    2. 如果此时在系统的lib中加入log4j.jar后,就会生成C:logsx.log,也会往x.log中写入内容成功。

    如果没有往x.log中写入内容成功,则可能的原因是有jar包的冲突。

    3. 不需要导入slf4j相关的jar包。

    4. 为 了简化配置 commons-logging ,一般不使用 commons-logging 的配置文件,也不设置与 commons-logging 相关的系统环境变量,而只需将 Log4j 的 Jar 包放置到 classpash 中就可以了。这样就很简单地完成了 commons-logging 与 Log4j 的融合

    二、Log4j 和commons-logging的关系和具体用法:

        (一)Logger.getLogger()和LogFactory.getLog()的区别
        1.Logger.getLogger()是使用log4j的方式记录日志;

        2.LogFactory.getLog()则来自apache的common-logging包。

    common-logging组件: 
           Jakarta Commons Logging (JCL)提供的是一个日志(Log)接口(interface),同时兼顾轻量级和不依赖于具体的日志实现工具。它提供给中间件/日志工具开发者一个简单的日志操作抽象,允许程序开发人员使用不同的具体日志实现工具。了解包里情况,可以查看它的API文档:http://www.oschina.net/uploads/doc/commons-logging-1.1.1/index.html , 其中Log(基本记录器)和LogFactory(负责创建Log实例)是两个基类。该API直接提供对下列底层日志记录工具的支持:Jdk14Logger,Log4JLogger,LogKitLogger,NoOpLogger (直接丢弃所有日志信息),还有一个SimpleLog。 有必要详细说明一下调用LogFactory.getLog()时发生的事情。调用该函数会启动一个发现过程,即找出必需的底层日志记录功能的实现,具体的发现过程在下面列出:  ( 换句话说就是, 有这么多工具,common-logging该使用哪一个呢?这取决于系统的设置,common-logging将按以下顺序决定使用哪个日志记录工具:)

            (1).common-logging首先在CLASSPATH中查找commons-logging.properties文件。这个属性文件至少定义 org.apache.commons.logging.Log属性,它的值应该是上述任意Log接口实现的完整限定名称。如果找到 org.apache.commons.logging.Log属相,则使用该属相对应的日志组件。结束发现过程。

            (2).如果上面的步骤失败(文件不存在或属相不存在),common-logging接着检查系统属性 org.apache.commons.logging.Log。如果找到org.apache.commons.logging.Log系统属性,则使 用该系统属性对应的日志组件。结束发现过程。
            (3).如果找不到org.apache.commons.logging.Log系统属性,common-logging接着在CLASSPATH中寻 找log4j的类。如果找到了就假定应用要使用的是log4j。不过这时log4j本身的属性仍要通过log4j.properties文件正确配置。结 束发现过程。
            (4).如果上述查找均不能找到适当的Logging API,但应用程序正运行在JRE 1.4或更高版本上,则默认使用JRE 1.4的日志记录功能。结束发现过程。
            (5).最后,如果上述操作都失败(JRE 版本也低于1.4),则应用将使用内建的SimpleLog。SimpleLog把所有日志信息直接输出到System.err。结束发现过程。

             根据不同的性质,日志信息通常被分成不同的级别,从低到高依次是:“调试( DEBUG )”“信息( INFO )”“警告( WARN )”“错误(ERROR )”“致命错误( FATAL )”。

    基于common-logging的运行方式:

    Java代码  收藏代码
    1. package org;   
    2. import org.apache.commons.logging.Log;   
    3. import org.apache.log4j.Logger;   
    4. public class Test extends TagSupport{   
    5. public static Log log=LogFactory.getLog(Test.class);   
    6. public static void test()   
    7. {   
    8. log.debug("111");   
    9. log.info("125");   
    10. log.warn("485");   
    11. log.error("error");   
    12.   
    13. }   
    14. public static void main(String[] a)   
    15. {   
    16. Test.test();   
    17. }   
    18. }   

     

       基于log4j的运行方式

    Java代码  收藏代码
    1. import org.apache.log4j.Logger;   
    2. import org.apache.log4j.PropertyConfigurator;   
    3. public class TestLog4j {   
    4.   
    5. static Logger logger = Logger.getLogger(TestLog4j.class);   
    6.    public static void main(String args[]) {   
    7.    PropertyConfigurator.configure("log4j.properties");   
    8.    logger.debug("Here is some DEBUG");   
    9.    logger.info("Here is some INFO");   
    10.       logger.warn("Here is some WARN");   
    11.       logger.error("Here is some ERROR");   
    12.       logger.fatal("Here is some FATAL");   
    13.    }   
    14. }  

     

     (二)、详细介绍Log4j

       ① Log4j的架构 
       Log4j系统的三大板块:日志写入器、日志输出终端、日志布局模式


    Log4j输出到控制台顺利,写入文件失败 - Log4j和commons log的整合

            Logger类是日志包的核心,Logger的名称是大小写敏感的,并且名称之间有继承关系。子名由父名做前缀,用点号“.”分隔,如x.y是x.y.z 的父亲Logger。Logger系统中有个根logger,是所有logger的祖先,它总是存在的,并且不可以通过名字获取,可以通过 Logger.getRootLogger()来获取。获取Logger对象的方法很多,可以参考API文档,在某对象中,用该对象所属的类作为参数,调 用Logger.getLogger(Class clazz)以获取logger对象被认为是目前所知最理智的命名logger方法。

       ②Log4j的日志级别(Level) 
           每个logger都有一个日志级别,用来控制日志的输出。未分配级别的logger将自动继承它最近的父logger的日志级别。Logger的由低到高级别如下: 
         ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF

       ③Log4j的输出终端(Appender接口) 

           Log4j提供了以下几个实现:

    Java代码  收藏代码
    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(将日志信息以流的格式发送到任意指定的地方)    
    6.   
    7. org.apache.log4j.ConsoleAppender(控制台)  
    8. org.apache.log4j.FileAppender(文件)  
    9. org.apache.log4j.DailyRollingFileAppender(每天都产生一个日志文件)  
    10. org.apache.log4j.RollingFileAppender(文件大小达到指定尺寸时产生一个新的日志文件,文件名称上会自动添加数字序号。)  
    11. org.apache.log4j.WriterAppender(将日志信息以流的格式发送到任意指定的地方)  

          默认情况下,子logger将继承父logger的所有appenders。

        ④Log4j的输出布局模式(Layout接口)  
          Log4j提供Layout有以下几种:

     

       

    Java代码  收藏代码
    1. org.apache.log4j.HTMLLayout(以HTML表格形式布局)     
    2. org.apache.log4j.PatternLayout(可以灵活地指定布局模式)     
    3. org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)     
    4. org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)    
    5.   
    6.  org.apache.log4j.HTMLLayout(以HTML表格形式布局)  
    7.  org.apache.log4j.PatternLayout(可以灵活地指定布局模式)  
    8.  org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)  
    9.  org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)  

         Log4j采用类似C语言中的printf函数的打印格式格式化日志信息。打印参数如下:

    Html代码  收藏代码
    1. %m:输出代码中指定的消息。     
    2. %p:输出优先级。     
    3. %r:输入自应用启动到输出该log信息耗费的毫秒数。     
    4. %c:输出所属的类目,通常就是所在类的全名。     
    5. %n:输出一个回车换行符。Windows平台为“ ”,UNIX为“ ”。     
    6. %d:输出日志时间点的日期或时间,默认格式为ISO8601,推荐使用“%d{ABSOLUTE}”,这个输出格式形如:“2007-05-07 18:23:23,500”,符合中国人习惯。     
    7. %l:输出日志事件发生的位置,包括类名、线程名,以及所在代码的行数。    
    8. %m:输出代码中指定的消息。  
    9. %c:输出所属的类目,通常就是所在类的全名。  
    10. %t:输出产生该日志线程的线程名。  
    11. %n:输出一个回车换行符。Windows平台为“ ”,UNIX为“ ”。  
    12. %d:输出日志时间点的日期或时间,默认格式为ISO8601,推荐使用“%d{ABSOLUTE}”,这个输出格式形如:“2007-05-07 18:23:23,500”,符合中国人习惯。  
    13. %l:输出日志事件发生的位置,包括类名、线程名,以及所在代码的行数。  
    14. %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-MM-dd HH:mm:ss },输出类似:2002-10-18- 22:10:28  
    15. %f 输出日志信息所属的类的类名  
    16. %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行  
    17. %m 输出代码中指定的信息,如log(message)中的message  
    18. %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推  
    19. %r 输出自应用启动到输出该日志信息所耗费的毫秒数  
    20. %t 输出产生该日志事件的线程名  

     

       

       ⑤Log4j的配置

        在实际使用中,Log4j一般是通过配置文件配置使用的。配置文件有两种,Java properties和XML文件。一般都选用properties文件来配置,因为简洁易读。下面只介绍Java properties的配置方式。 
    对Log4j的配置就是对rootLogger和子Logger的配置。主要的配置项为:rootLogger、输出终端、输出布局模式,所有的配置项都必须以log4j开头。 
        配置文件的示例

       

    Java代码  收藏代码
    1. ##Log4J的配置之简单使它遍及于越来越多的应用中了     
    2.     
    3. ##Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了。     
    4.     
    5. ##此文件(log4j.properties)内容来自网络,非本文作者liigo原创。     
    6. log4j.rootLogger = DEBUG, CONSOLE,A1     
    7. log4j.addivity.org.apache = true    
    8.     
    9. # 应用于控制台     
    10. log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender     
    11. log4j.appender.Threshold = DEBUG     
    12. log4j.appender.CONSOLE.Target = System.out     
    13. log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout     
    14. log4j.appender.CONSOLE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n     
    15. #log4j.appender.CONSOLE.layout.ConversionPattern = [start] % d {DATE} [DATE] % n % p[PRIORITY] % n % x[NDC] % n % t[THREAD] n % c[CATEGORY] % n % m[MESSAGE] % n % n     
    16.     
    17. #应用于文件     
    18. log4j.appender.FILE = org.apache.log4j.FileAppender     
    19. log4j.appender.FILE.File = file.log     
    20. log4j.appender.FILE.Append = false    
    21. log4j.appender.FILE.layout = org.apache.log4j.PatternLayout     
    22. log4j.appender.FILE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n     
    23. # Use this layout for LogFactor 5 analysis     
    24.     
    25. # 应用于文件回滚     
    26. log4j.appender.ROLLING_FILE = org.apache.log4j.RollingFileAppender     
    27. log4j.appender.ROLLING_FILE.Threshold = ERROR     
    28. log4j.appender.ROLLING_FILE.File = rolling.log     
    29. log4j.appender.ROLLING_FILE.Append = true    
    30. log4j.appender.ROLLING_FILE.MaxFileSize = 10KB     
    31. log4j.appender.ROLLING_FILE.MaxBackupIndex = 1    
    32. log4j.appender.ROLLING_FILE.layout = org.apache.log4j.PatternLayout     
    33. log4j.appender.ROLLING_FILE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n     
    34.     
    35. #应用于socket     
    36. log4j.appender.SOCKET = org.apache.log4j.RollingFileAppender     
    37. log4j.appender.SOCKET.RemoteHost = localhost     
    38. log4j.appender.SOCKET.Port = 5001    
    39. log4j.appender.SOCKET.LocationInfo = true    
    40. # Set up for Log Facter 5    
    41. log4j.appender.SOCKET.layout = org.apache.log4j.PatternLayout     
    42. log4j.appender.SOCET.layout.ConversionPattern = [start] % d {DATE} [DATE] % n % p[PRIORITY] % n % x[NDC] % n % t[THREAD] % n % c[CATEGORY] % n % m[MESSAGE] % n % n     
    43.     
    44. # Log Factor 5 Appender     
    45. log4j.appender.LF5_APPENDER = org.apache.log4j.lf5.LF5Appender     
    46. log4j.appender.LF5_APPENDER.MaxNumberOfRecords = 2000    
    47.     
    48. # 发送日志给邮件     
    49. log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender     
    50. log4j.appender.MAIL.Threshold = FATA     
    51. log4j.appender.MAIL.BufferSize = 10    
    52. log4j.appender.MAIL.From = web@www.wuset.com     
    53. log4j.appender.MAIL.SMTPHost = www.wusetu.com     
    54. log4j.appender.MAIL.Subject = Log4J Message     
    55. log4j.appender.MAIL.To = web@www.wusetu.com     
    56. log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout     
    57. log4j.appender.MAIL.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n     
    58.     
    59.     
    60. # 用于数据库     
    61. log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender     
    62. log4j.appender.DATABASE.URL = jdbc:mysql: // localhost:3306/test     
    63. log4j.appender.DATABASE.driver = com.mysql.jdbc.Driver     
    64. log4j.appender.DATABASE.user = root     
    65. log4j.appender.DATABASE.password =     
    66. log4j.appender.DATABASE.sql = INSERT INTO LOG4J (Message) VALUES ( ' [framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ' )     
    67. log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout     
    68. log4j.appender.DATABASE.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n     
    69. log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender     
    70. log4j.appender.A1.File = SampleMessages.log4j     
    71. log4j.appender.A1.DatePattern = yyyyMMdd - HH ' .log4j '    
    72. log4j.appender.A1.layout = org.apache.log4j.xml.XMLLayout     
    73.     
    74. #自定义Appender     
    75. log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender     
    76. log4j.appender.im.host = mail.cybercorlin.net     
    77. log4j.appender.im.username = username     
    78. log4j.appender.im.password = password     
    79. log4j.appender.im.recipient = corlin@cybercorlin.net     
    80. log4j.appender.im.layout = org.apache.log4j.PatternLayout     
    81. log4j.appender.im.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n     
    82.     
    83. # 结束    


    (本文来自互联网,不代表搜站(http://www.ylzx8.cn/)的观点和立场)
    本站所有内容来自互联网,若本站收录的信息无意侵犯了贵司版权,请给我们来信(ylzx8cn@163.com),我们会及时处理和回复,谢谢

  • 相关阅读:
    Poj 1742 Coins(多重背包)
    Poj 2350 Above Average(精度控制)
    求二进制数中1的个数
    Poj 1659 Distance on Chessboard(国际象棋的走子规则)
    Poj 2411 Mondriaan's Dream(压缩矩阵DP)
    Poj 2136 Vertical Histogram(打印垂直直方图)
    Poj 1401 Factorial(计算N!尾数0的个数——质因数分解)
    poj 2390 Bank Interest(计算本利和)
    Poj 2533 Longest Ordered Subsequence(LIS)
    Poj 1887 Testing the CATCHER(LIS)
  • 原文地址:https://www.cnblogs.com/zguood/p/4532682.html
Copyright © 2020-2023  润新知