log4j分层打印

Posted wuqiqing_1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了log4j分层打印相关的知识,希望对你有一定的参考价值。

1、log4j的配置:

----属性配置
 

log4j.rootLogger=info,CONSOLE,RFILE,FILE,DB 设置级别和三个输出端
 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
 log4j.appender.CONSOLE.Target=System.out 控制台类型
 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
 log4j.appender.CONSOLE.layout.ConversionPattern= %4p [%t] (%F:%L) - %m%n

 log4j.appender.FILE=org.apache.log4j.FileAppender 
 log4j.appender.FILE.File=/help/my.properties 目标文件
 log4j.appender.FILE.Append=false 是否追加
 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 布局模式
 log4j.appender.FILE.layout.ConversionPattern=%dyyyy-MM-dd hh:mm:ss:%p %c:%L - %m%n 格式化布局

 log4j.appender.RFILE=org.apache.log4j.RollingFileAppender 
 log4j.appender.RFILE.File=/help/my.properties 目标文件
 log4j.appender.RFILE.MaxFileSize=1KB 最大长度
 log4j.appender.RFILE.MaxBackupIndex=3 最多备份
 log4j.appender.RFILE.layout=org.apache.log4j.PatternLayout 布局模式
 log4j.appender.RFILE.layout.ConversionPattern=%dyyyy-MM-dd hh:mm:ss:%p %c:%L - %m%n 格式化布局

 log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender 
 log4j.appender.DB.URL=jdbc:oracle:thin:@127.0.0.1:1521:mumu URL
 log4j.appender.DB.driver=oracle.jdbc.driver.OracleDriver 驱动
 log4j.appender.DB.user=liulibo 用户名
 log4j.appender.DB.password=liulibo 密码
 log4j.appender.DB.layout=org.apache.log4j.PatternLayout 布局模式
 log4j.appender.DB.layout.ConversionPattern=insert into log4j(createdate,thread,level_,class,message)    values(\\'%d\\',\\'%t\\',\\'%-5p\\',\\'%c\\',\\'%m\\')

 create table log4j(createdate varchar2(32),thread varchar2(32),level_ varchar2(32),class varchar2(32),message varchar2(32));

----xml配置

<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">  
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">  
  
  
    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">  
        <layout class="org.apache.log4j.SimpleLayout" />  
    </appender>  
    <!-- 根,会把所有涉及到的log都打印出来  
           根logger没有默认的appender   
           根logger默认被分配了Level.DEBUG的级别  
    -->  
    <root>  
        <level value="INFO" />  
        <appender-ref ref="ConsoleAppender" />  
    </root>  
      
    <!--   
    A、  
        (1)、如果类别的名称(后面加一个点)是其子类别名称的前缀,则它就是另一个类别的祖类  
        (2)、如果一个类别和它的子类别之间没有其他的继承关系,我们就称之为parent与child的关系  
         例如:类别com.foo是类别com.foo.Bar的parent。  
    B、  
         根(root) 类别位于logger继承结构的最上层。它有两种例外:  
        (1) 它一直存在  
        (2) 它不能根据名称而获得。  
        调用类的静态方法Logger.getRootLogger可以得到它  
    C、  
        如果一个Logger没有被分配一个级别,那么它将从一个被分配了级别的最接近它的ancestor哪里继承。  
        正规的说:级别的继承:对于一个给定的Logger C,它的继承的级别等于从C开始上溯到的第一个拥有非空级别的Logger的级别。  
    D、  
        对于一个给定的logger,它每个生效的日志请求都被转发到logger所有的appender上和该logger的父辈logger的appender上。  
        换句话说,appende自动从它的父辈获得继承。举例来说,如果一个根logger拥有一个console appender,  
        那么所有生效的日志请求至少会被输出到console上。  
        如果一个名为C的logger有一个file类型的appender,那么它就会对它自己以及所有它的子logger生效。  
    E、  
        我们也可以通过设置appender的additivity flag为false,来重载appender的默认行为,以便继承的属性不在生效。  
    F、  
        Log4j的子logger只连接到已经存在的它们的父代。特别的是,名为com.foo.bar的logger是直接连接到根logger,  
        而不是围绕着没用的com或com.foo logger。这显著的提高了程序性能并且减少的内存占用。  
    G、  
        避免参数构建的花费应如下,  
        if(logger.isDebugEnabled()   
            logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));  
          
        如果logger的debug被关闭这将不会招致参数构建的花费。另一方面,如果logger是debug的话,它将产生两次判断 logger是否能用的花费。  
        一次是在debugenabled,一次是debug。这是无关紧要的,因为判断日志是否可用只占日志实际花费时间的约1%。  
    H、  如果是DailyRollingFileAppender的话,不会立刻生成error.log.2014.02.23.log,而是先生成error.log,然后等到这天的  
       23:59分,把当天的日志写到error.log.2014.02.23.log的文件中去  
             如果DailyRollingFileAppender的append=true的话,即使当天没有日志,也会生成error.log.2014.02.23.log文件,否则不会生成  
     -->  
    <!-- dao层的日志 -->  
    <appender name="dao" class="org.apache.log4j.FileAppender">  
        <param name="File" value="$webapp.root/logs/dao.log" />  
        <param name="Append" value="true" />  
        <!--   
        Log4j提供的layout有以下几种:  
        org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
        org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
        org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
        org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)  
          
        %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
        %r 输出自应用启动到输出该log信息耗费的毫秒数  
        %c 输出所属的类目,通常就是所在类的全名  
        %t 输出产生该日志事件的线程名  
        %n 输出一个回车换行符,Windows平台为"\\r\\n",Unix平台为"\\n"  
        %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%dyyy MMM dd HH:mm:ss,SSS,输出类似:2002年10月18日 22:10:28,921  
        %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)  
         -->  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d [%t] %p - %m%n" />  
        </layout>  
    </appender>  
    <!-- 以com.hj.dao包开头的所涉及到的类进行log -->  
    <logger name="com.hj.dao" additivity="true">  
        <level value="INFO" />  
        <appender-ref ref="dao" />  
    </logger>  
      
    <!-- service层的日志 -->  
    <appender name="service" class="org.apache.log4j.FileAppender">  
        <param name="File" value="$webapp.root/logs/service.log" />  
        <param name="MaxFileSize" value="5MB" />  
        <param name="MaxBackupIndex" value="20" />  
        <param name="Encoding" value="utf-8"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d [%-5p][%t] %c1 %m %n" />  
        </layout>  
    </appender>  
    <!-- 以com.hj.service包开头的所涉及到的类进行log -->  
    <logger name="com.hj.service" additivity="true">  
        <level value="INFO" />  
        <appender-ref ref="service" />  
    </logger>  
      
    <!-- controller层的日志 -->  
    <appender name="controller" class="org.apache.log4j.RollingFileAppender">  
        <param name="File" value="$webapp.root/logs/controller.log" />  
        <param name="MaxFileSize" value="5MB" />  
        <param name="MaxBackupIndex" value="20" />  
        <param name="Encoding" value="utf-8"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d [%-5p][%t] %c1 %m %n" />  
        </layout>  
    </appender>  
    <!-- 以com.hj.controller包开头的所涉及到的类进行log -->  
    <!-- 输出源的可添加性(Appender Additivity):一个名为C的logger的日志定义的输出将延续到它自身以及它的ancestor logger的appenders  
         Loggers的附加标记(additivity flag)默认为true。 -->  
    <logger name="com.hj.controller" additivity="true">  
        <level value="INFO" />  
        <appender-ref ref="controller" />  
    </logger>  
      
    <!-- 异常捕获的日志 -->  
    <appender name="error" class="org.apache.log4j.RollingFileAppender">  
        <param name="File" value="$webapp.root/logs/error.log" />  
        <param name="MaxFileSize" value="5MB" />  
        <param name="MaxBackupIndex" value="20" />  
        <param name="Encoding" value="utf-8"/>  
        <layout class="org.apache.log4j.PatternLayout">  
            <param name="ConversionPattern" value="%d [%-5p][%t] %c1 %m %n" />  
        </layout>  
    </appender>  
    <!-- 对com.hj.exception.ErrorHandler类进行log -->  
    <logger name="com.hj.exception.ErrorHandler" additivity="true">  
        <level value="ERROR" />  
        <appender-ref ref="error" />  
    </logger>  
</log4j:configuration>  


 

2、 分层调用代码

@Repository  
public class UserDao   
      
    private Logger logger = Logger.getLogger(this.getClass());  
      
    public void show()  
        logger.info("this is DAO add");  
      
      
    public void exception()  
        String str = null;  
        try  
            str.charAt(2);  
        catch(Exception e)  
            logger.error("DAO空指针异常", e);  
          
      
  
    public void throwsExcep() throws Exception  
        String str = null;  
        logger.info("dao测试异常");  
        str.charAt(2);  
      

public class UserService   
      
    private Logger logger = Logger.getLogger(this.getClass());  
      
    @Resource  
    private UserDao userDao;  
      
    public void show()  
        logger.info("ths is Service add");  
        userDao.show();  
      
      
    public void exception()  
        String str = null;  
        try  
            str.charAt(2);  
        catch(Exception e)  
            logger.error("Service空指针异常", e);  
          
        userDao.exception();  
      
      
    public void throwsExcep() throws Exception  
        logger.info("service测试异常");  
        userDao.throwsExcep();  
      
  
@Controller  
public class UserController   
      
    private Logger logger = Logger.getLogger(this.getClass());  
      
    @Resource  
    private UserService userService;  
      
    @RequestMapping(value = "/show")  
    public String show()  
        logger.info("this is Controller add");  
        userService.show();  
        return "index";  
      
      
    @RequestMapping(value = "/exception")  
    public String exception()  
        String str = null;  
        try  
            str.charAt(2);  
        catch(Exception e)  
            logger.error("Controller空指针异常", e);  
          
        userService.exception();  
        return "index";  
      
  
    @RequestMapping(value = "/throwsExcep")  
    public String throwsExcep() throws Exception  
        logger.info("controller测试异常");  
        userService.throwsExcep();  
        return "index";  
      

@ControllerAdvice   
public class ErrorHandler   
      
    private Logger logger = Logger.getLogger(this.getClass());  
      
    @ExceptionHandler(value = Exception.class)  
    public @ResponseBody Object errorResponse(Exception e)   
        logger.error("异常处理中心", e);  
        return e;  
      
  

3、参考api

获取logger
Logger.getRootLogger() 获取根logger
Logger.getLogger(String name)获取子logger
Logger.getLogger(Class clazz)或
Logger.getLogger(clazz.getName())

设置日志级别(.setLevel(int,Exception))
Level.ALL打开所有日志
Level.DEBUG 用于调试
Level.INFO 用于运行过程
Level.WARN 用于潜在的错误
Level.ERROR 用于错误事件
Level.FATAL 用于严重错误时间
Level.OFF 关闭所有日志

输出端Appender(.addAppender(Appender).setAdditivity(boolean additive)是否覆盖)
org.apache.log4j.ConsoleAppender 输出到控制台
targer:
ConsoleAppender.SYSTEM_OUT(Default)
ConsoleAppender.SYSTEM_ERR
public ConsoleAppender(Layout)
public ConsoleAppender(Layout,String targer)
org.apache.log4j.FileAppender 输出到文件
public FileAppender(Layout,String fileName)
public FileAppender(Layout,String fileName,boolean append)是否覆盖
org.apache.log4j.DailyRollingFileAppender 输出到文件,每天一个新文件
org.apache.log4j.RollingFileAppender 输出到文件,自动新增改名
public RollingFileAppender(Layout,String fileName)
void setMaxBackupIndex(int index) 设置日志文件最大备份数
void setMaximumFileSize(long size) 设置日志文件最大尺寸
org.apache.log4j.WriterAppender 流格式输出到任意地方
org.apache.log4j.JDBCAppender 输出到数据库

日志格式化(Layout)
%c 类全名
%d 时间
%f 类名
%l 位置
%m 信息
%n 换行
%p 级别
%r 耗时
%t 线程名

public PatternLayout() 使用默认设置DEFAULT_CONVERSION_PATTERN 只打印信息
public PatternLayout(String)使用自定义的pattern构造一个PatternLayout
void setConversionPattern(String) 设置日志格式
HTMLLayout
SimpleLayout


5.
1.BasicConfigurator.configure()
PatternLayout p = new PatternLayout("%p [%t] %c (%F:%L) - %m%n"); 
ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT); 
root.addAppender(a); 
rootLogger.setLevel(Level.DEBUG); 
2.PropertyConfigurator.configure("/help/example.properties")
String resource = "/help/example.properties";
URL configFileResource = Log4J.class.getResource(resource);
PropertyConfigurator.configure(configFileResource);
3.DOMConfigurator.configure("/help/example.xml")
xml declaration and dtd 
| 
log4j:configuration 
| 
+-- appender (name, class) 
| | 
| +-- param (name, value) 
| +-- layout (class) 
| | 
| +-- param (name, value) 
+-- logger (name, additivity) 
| | 
| +-- level (class, value) 
| | | 
| | +-- param (name, value) 
| +-- appender-ref (ref) 
+-- root 
| 
+-- param (name, class) 
+-- level 
| | 
| +-- param (name, value) 
+-- appender-ref (ref)




以上是关于log4j分层打印的主要内容,如果未能解决你的问题,请参考以下文章

log4j2+slf4j日志不打印问题

怎么配置log4j 打印出sql语句

如何将web应用项目中log4j的日志只打印到独立的文件,不打印在Tomcat的catalina.out?

maven中执行JUnit测试的时候,我使用log4j进行日志打印,怎样才能获取log4j打印的日志?

log4j 不打印日志

log4j.xml打印日志信息