参考引用自: http://javacrazyer.iteye.com/blog/1135493

我的git地址: https://git.oschina.net/KingBoBo/Log4JDemo.git

基于log4j的运行方式

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class TestLog4j {
  static Logger logger = Logger.getLogger(TestLog4j.class);
  public static void main(String args[]) {
  PropertyConfigurator.configure("log4j.properties");
   logger.debug("Here is some DEBUG");
   logger.info("Here is some INFO");
  logger.warn("Here is some WARN");
   logger.error("Here is some ERROR");
   logger.fatal("Here is some FATAL");
}
}

① Log4j的架构

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

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<TRACE<DEBUG<INFO<WARN<ERROR<FATAL<OFF

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

org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天都产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小达到指定尺寸时产生一个新的日志文件,文件名称上会自动添加数字序号。)
org.apache.log4j.WriterAppender(将日志信息以流的格式发送到任意指定的地方)

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

④Log4j的输出布局模式(Layout接口)

Log4j提供Layout有以下几种:

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

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

%m:输出代码中指定的消息。
%p:输出优先级。
%r:输入自应用启动到输出该log信息耗费的毫秒数。
%c:输出所属的类目,通常就是所在类的全名。
%n:输出一个回车换行符。Windows平台为“\r\n”,UNIX为“\n”。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,推荐使用“%d{ABSOLUTE}”,这个输出格式形如:“2007-05-07 18:23:23,500”,符合中国人习惯。
%l:输出日志事件发生的位置,包括类名、线程名,以及所在代码的行数。
%m:输出代码中指定的消息。
%c:输出所属的类目,通常就是所在类的全名。
%t:输出产生该日志线程的线程名。

⑤Log4j的配置

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

##Log4J的配置之简单使它遍及于越来越多的应用中了
##Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。择其一二使用就够用了。 ##此文件(log4j.properties)内容来自网络,非本文作者liigo原创。
log4j.rootLogger = DEBUG, CONSOLE,A1
log4j.additivity.org.apache = true # 应用于控制台
log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold = DEBUG
log4j.appender.CONSOLE.Target = System.out
log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern = [framework] %d - %c -%-4r [ %t] %-5p %c %x - %m %n
# 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 #应用于文件
log4j.appender.FILE = org.apache.log4j.FileAppender
log4j.appender.FILE.File = ../logs/file.log
log4j.appender.FILE.Append = false
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = [framework] %d - %c -%-4r [ %t] %-5p %c %x - %m %n
# log4j.appender.FILE.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss,SSS}]>>>>>[%l]-[%m] %x %n [%-5p]
# Use this layout for LogFactor 5 analysis # 应用于文件回滚
log4j.appender.ROLLING_FILE = org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold = ERROR
log4j.appender.ROLLING_FILE.File = ../logs/rolling.log
log4j.appender.ROLLING_FILE.Append = true
log4j.appender.ROLLING_FILE.MaxFileSize = 10KB
# 最多100个文件
log4j.appender.ROLLING_FILE.MaxBackupIndex = 100
log4j.appender.ROLLING_FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern = [framework] %d - %c -%-4r [ %t] %-5p %c %x - %m %n
# 输出文件编码
log4j.appender.ROLLING_FILE.encoding = UTF-8 #应用于socket
log4j.appender.SOCKET = org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost = localhost
log4j.appender.SOCKET.Port = 5001
log4j.appender.SOCKET.LocationInfo = true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout = org.apache.log4j.PatternLayout
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 # Log Factor 5 Appender
log4j.appender.LF5_APPENDER = org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords = 2000 # 发送日志给邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=ERROR
log4j.appender.MAIL.BufferSize=1
log4j.appender.MAIL.SMTPHost=smtp.163.com
log4j.appender.MAIL.From=from1@163.com
log4j.appender.MAIL.SMTPUsername=from1
log4j.appender.MAIL.SMTPPassword=123456
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=to2@163.com,359920692@qq.com
log4j.appender.MAIL.Encoding=UTF-8
#Bcc mean send copy to this email
log4j.appender.MAIL.Bcc=bcc3@163.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d{yy-MM-dd HH:mm:ss} - %c -%-4r [ %t] %-5p %c %x - %m %n # 用于数据库
log4j.appender.DATABASE = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL = jdbc:mysql: // localhost:3306/test
log4j.appender.DATABASE.driver = com.mysql.jdbc.Driver
log4j.appender.DATABASE.user = root
log4j.appender.DATABASE.password =
log4j.appender.DATABASE.sql = INSERT INTO LOG4J (Message) VALUES ( ' [framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ' )
log4j.appender.DATABASE.layout = org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern = [framework] %d - %c -%-4r [ %t] %-5p %c %x - %m %n log4j.appender.A1 = org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File = SampleMessages.log4j
log4j.appender.A1.DatePattern = yyyyMMdd - HH ' .log4j '
log4j.appender.A1.layout = org.apache.log4j.xml.XMLLayout #自定义Appender
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout = org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern = [framework] %d - %c -%-4r [ %t] %-5p %c %x - %m %n

#指定com.bobo.code.web.controller包下面的类为WARN级别,
#则该包下类中只有log.error("message"),log.warn("message")可输出.
#log.debug("message")无法输出,因为debug<WARN
#必须注意的是,这里定义的WARN级别必须>=rootLogger的DEBUG级别(相当于子级别必须>=父级别)
log4j.logger.com.bobo.code.web.controller=WARN
# 结束

附自己最常用的自定义日志格式

log4j.appender.CONSOLE.layout.ConversionPattern=[MyProjectName][%-5p][%d{yyyy-MM-dd HH:mm:ss,SSS}]>>>>>[ %l]-[%m] %x %n

https://www.cnblogs.com/bobo1713930654/diary/2018/12/14/10119942.html

配置文件中细节解释:

首先我们要明白配置文件中最重要的几个概念:

  • log4j.rootLogger : 根logger

  • log4j.logger : 子logger

  • log4j.appender : 输出源

  • log4j.additivity : 指定某个子Logger是否继承根logger的所有配置

log4j.rootLogger解释

log4j.rootLogger = [ level ] , appenderName_1 , appenderName_2 , ......

level

指定哪个优先级以上的日志允许输出,优先级分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别, 您可以控制应用程序中相应级别的日志信息的开关。

比如在这里定义了INFO级别,只有等于及高于INFO级别才进行输出,于是DEBUG级别的日志信息将不被打印出来。

ALL: 打印所有的日志,OFF: 关闭所有的日志输出。

appenderName

appenderName就是指定日志信息以什么格式输出到哪个地方。

log4j.additivity解释

log4j.additivity.org.apache = true (默认为true)

意为 子Logger 是继承 父Logger 的 输出源(appender) , 即默认情况子Logger会在(爷Logger) rootLogger的appender里输出。

那具体什么叫日志继承呢?

比如有下面这样的配置

log4j.rootLogger=INFO,CONSOLE,DailyFileAppender
log4j.additivity.com.abc.controller=TRUE
log4j.logger.com.abc.controller=INFO,DailyFileAppender

那么com.abc.controller子包及子孙包下的类都需要INFO以上级别才能输出, 当 additivity=TRUE 时会导致logger指定的DailyFileAppender无效,强制以rootLogger(父Logger)的标准进行输出, 于是日志既会输出到CONSOLE控制台, 也会输出到DailyFileAppender的每日文件中

然后我们改成 additivity=FALSE

log4j.rootLogger=INFO,CONSOLE,DailyFileAppender
log4j.additivity.com.abc.controller=FALSE
log4j.logger.com.abc.controller=INFO,DailyFileAppender

那么com.abc.controller子包及子孙包下的类都需要INFO以上级别才能输出, 当 additivity=FALSE 时会导致logger指定以DailyFileAppender输出, 不再关心rootLogger(父Logger)的配置, 于是日志只会输出到DailyFileAppender的每日文件中,

所以指定 log4j.additivity.com.abc.controller=FALSE 相当于声明该包及子孙包下的类不使用父Logger的Appender , 避免大量重复的日志产生.

另外为了日志的清晰地分类 , 有必要配置log4j.additivity和log4j.logger的一一对应,如下配置,

让com.abc.controller中的日志只输出到每日文件DailyFileAppender中,

让com.abc.mail中的日志只输出到邮件中

log4j.rootLogger=INFO,CONSOLE,DailyFileAppender,MailAppender
log4j.additivity.com.abc.controller=FALSE
log4j.logger.com.abc.controller=INFO,CONSOLE
log4j.additivity.com.abc.mail=FALSE
log4j.logger.com.abc.mail=INFO,MailAppender

Threshold解释

#threshold英文意为门槛
log4j.appender.CONSOLE.Threshold=WARN

强制设置CONSOLE日志的最低输出级别为WARN, 默认为DEBUG , 此时输出到CONSOLE中的日志级别必须大于等于WARN才能输出到控制台

特别声明,当被花了大量时间比较别人的 ibatis日志为何能输出,我的死活不输出,就是被这货坑的.大家尽量不要动它,让它默认为DEBUG就好.

https://www.cnblogs.com/bobo1713930654/diary/2018/12/14/10119942.html

log4j.xml配置参考

有时候我们会发现项目中没有log4j.properties,取而代之的是log4j.xml,这个看人人喜好,二者选其一放在src目录下即可.

log4j.xml样例,下例意为把日志info级别(包括)以上的输出到控制台,正常日志文件和异常日志文件中.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <!--======================appender Begin==============================-->
<!---->
<appender name="log.console"
class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="kingtool【%d{yyyyMMdd HH:mm:ss,SSS}】>>%5p>>【%c】-%m%n" />
</layout>
</appender> <appender name="log.app"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="../logs/kingtool/kingtool_app.log" />
<param name="Append" value="true" />
<param name="Threshold" value="INFO" />
<param name="MaxBackupIndex" value="1" />
<param name="MaxFileSize" value="10MB" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="kingtool【%d{yyyyMMdd HH:mm:ss,SSS}】>>%5p>>【%c】-%m%n" />
</layout>
</appender> <appender name="log.err"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="../logs/kingtool/kingtool_err.log" />
<param name="Append" value="true" />
<param name="Threshold" value="ERROR" />
<param name="MaxBackupIndex" value="1" />
<param name="MaxFileSize" value="10MB" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="kingtool【%d{yyyyMMdd HH:mm:ss,SSS}】>>%5p>>【%c】-%m%n" />
</layout>
</appender> <!--======================appender End==============================--> <!--logger for kingtool_application -->
<logger name="com.kingtool.www">
<level value="debug" />
</logger> <!-- mybatis logger start -->
<logger name="org.apache.ibatis.logging.jdbc.ConnectionLogger ">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis.logging.jdbc.PreparedStatementLogger">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis.logging.jdbc.ResultSetLogger">
<level value="debug" />
</logger>
<logger name="org.apache.ibatis.logging.jdbc.StatementLogger">
<level value="debug" />
</logger>
<!-- mybatis logger end -->
<!--======================Loggers End==============================--> <!--logger for kingtool , spring , hibernate... --> <root>
<level value="info" />
<appender-ref ref="log.console" />
<appender-ref ref="log.app" />
<appender-ref ref="log.err" />
</root>
</log4j:configuration>

遇见异常

点击eclipse日志中的链接提示:Unable to parse type name from hyperlink

将[%l]改为 [空格%l],也就是在“%l”和左括号“[”之前加一个空格 , 变成 [ %l]

其它参考:

mybatis显示sql语句 log4j.properties配置文件: http://blog.csdn.net/tyust512/article/details/48241109

log4J配置及在web.xml文件中的配置: https://my.oschina.net/lhplj/blog/274564

优质文章

Log4j Threshold属性指定输出等级==>http://www.cnblogs.com/wqsbk/p/6817871.html

最新文章

  1. Django中载入js和css文件
  2. ZOJ 3170 Friends
  3. Android SlidingMenu 滑出侧边栏
  4. IPicture总结
  5. windows接口被占用
  6. mfc 链接时错误 文件函数重复定义
  7. PHP SPL迭代模式
  8. 笔记:Spring Cloud Hystrix Command属性
  9. MOCK API 的定义及实践(使用eolinker实现)
  10. 北大poj- 1013
  11. Linux查看系统的基本信息
  12. H5常用技巧
  13. leetcode322
  14. 【Hadoop 分布式部署 九:分布式协作框架Zookeeper架构 分布式安装部署 】
  15. Liunx Pwd
  16. 《DSP using MATLAB》Problem 3.21
  17. docker images 详解
  18. HTTP1.0,HTTP1.1,HTTP2.0的主要特征对比
  19. Firefox缓存文件夹位置设置及清除缓存方法
  20. 【CSS】 布局之圣杯布局

热门文章

  1. CrawlSpider爬取拉钩
  2. spi slaver接口的fpga实现
  3. composer 重装常见错误
  4. Haproxy 优化
  5. 【dp】P1434 [SHOI2002]滑雪
  6. 生产者&amp;消费者.py
  7. bzoj1047/luogu2216 理想的正方形 (单调队列)
  8. LOJ#6283. 数列分块入门 7
  9. js 判断 是否在当前页面 当前页面是否在前端
  10. 利用selenium并使用gevent爬取动态网页数据