Log4j是Apache的一个开源项目,官网地址为http://logging.apache.org/log4j/1.2/index.html。通过使用Log4j,可控制日志信息输出到控制台、文件、数据库等不同的地方;可以控制每一条日志的输出格式,通过定义每一条日志信息的级别,可以更加细致的控制日志的生成过程。Log4j是曾经风靡一时的日志框架,但现在逐渐被新的日志框架所取代:Log4j2、logback。本文主要介绍下Log4j的使用方法,文中所使用到的软件版本:Java 1.8.0_191、log4j 1.2.17。

1、初始化过程

log4j初始化是会查找log4j.configuration系统属性对应的配置文件,如果没有则在classpath下查找log4j.properties文件;程序中也可以通过PropertyConfigurator来加载配置文件。

2、日志信息的优先级

Log4j日志级别是定义在org.apache.log4j.Level类中,Log4j只建议使用其中4个级别,优先级从高到低分别是error、warn、info、debug。

3、日志信息的输出目的地 (appender)

Log4j提供的appender有以下几种:

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

4、日志信息的输出格式(layout)

Log4j提供的layout有以下几种:

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

这里主要介绍PatternLayout,它通过参数来格式化日志信息:

%d 输出日志记录事件的日期,默认格式为ISO8601,也可以在其后指定格式;如:%d{dd MMM yyyy HH:mm:ss,SSS},输出类似:02 Nov 2012 14:34:02,781
%p 输出日志记录事件的优先级
%t 输出生成日志记录事件的线程的名称
%c 输出日志记录事件的类别;后面可以给出精度,如类别为"a.b.c",%c{2}将输出"b.c"
%C 输出发出日志记录请求的调用方的完全限定类名称;后面可以给出精度,如类别为"a.b.c",%c{1}将输出"c"
%M 输出发出日志记录请求的方法名称
%F 输出发出日志记录请求的文件名。生成调用方位置信息的速度极其缓慢,除非执行速度不是问题,否则应避免使用。
%L 输出发出日志记录请求的文件行号。生成调用方位置信息的速度极其缓慢,除非执行速度不是问题,否则应避免使用。
%m 输出应用程序提供的消息
%n 输出与平台相关的行分隔符,Windows平台为\r\n,Unix平台为\n
%x 输出与生成日志记录事件的线程关联的NDC(嵌套诊断上下文)
%X 用于输出与生成日志记录事件的线程关联的MDC(映射诊断上下文)。通常用于多个客户端连接同一台服务器,方便服务器区分是哪个客户端访问留下来的日志。如%X{5}将记录代号为5的客户端的日志

默认情况下,相关信息会全部输出;可以借助格式修改器,更改最小字段宽度、最大字段宽度和对齐方向。格式修改器放置在百分比符号和转换字符之间。

%20c 如果类别名称少于20个字符,则用空格左垫。
%-20c 如果类别名称少于20个字符,则用空格右垫。
%.30c 如果类别名称长于30个字符,则从左开始截取掉多余的字符。
%20.30c 如果类别名称少于20个字符,则用空格左垫;如果类别名称长于30个字符,则从左开始截取掉多余的字符。
%-20.30c 如果类别名称少于20个字符,则用空格右垫;如果类别名称长于30个字符,则从左开始截取掉多余的字符。

更多相关说明参见 http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

5、与SLF4J结合使用

5.1、log4j转为SLF4j

把log4j的日志转换为slf4j输出,用log4j-over-slf4j替换commons-logging的jar包。

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.30</version>
</dependency>

5.2、SLF4j绑定log4j

slf4j使用log4j来输出日志;引入slf4j-log4j12的jar包即可。

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
</dependency>

注:log4j-over-slf4j和slf4j-log4j12不能同时使用,否则会导致日志事件在SLF4J和log4j之间死循环。

6、实际使用

6.1、配置文件log4j.properties

log4j.rootLogger=info,stdout
log4j.logger.com.inspur=file1,file2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%t] %C.%M [%F:%L] %x -> %m%n #每天会把日志文件重命名为带前一天日期后缀的文件,如今天为2019-12-30,则文件名为file1.log.2019-12-29,新的日志还输出到file1.log
log4j.appender.file1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file1.File=d:/temp/file1.log
log4j.appender.file1.DatePattern=.yyyy-MM-dd
log4j.appender.file1.layout=org.apache.log4j.PatternLayout
log4j.appender.file1.layout.ConversionPattern=%d %p [%t] %C.%M [%F:%L] %x -> %m%n #日志文件超过1KB,则把日志文件重命名为file2.log.1、file2.log.2等等,新的日志还输出到file2.log
log4j.appender.file2=org.apache.log4j.RollingFileAppender
log4j.appender.file2.File=d:/temp/file2.log
log4j.appender.file2.MaxFileSize=1KB
log4j.appender.file2.MaxBackupIndex=10
log4j.appender.file2.layout=org.apache.log4j.PatternLayout
log4j.appender.file2.layout.ConversionPattern=%d %p [%t] %C.%M [%F:%L] %x -> %m%n

rootLogger配置方式为:

log4j.rootLogger=[level],appender1,appender2

其他logger配置方式为:

log4j.logger.loggerName=[level],appender1,appender2

appender的配置方式为:

log4j.appender.appenderName=类全名或开头的一部分
log4j.appender.appenderName.option1=value1
log4j.appender.appenderName.option2=value2

6.2、代码例子

package com.inspur.demo.log;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator; /**
* log4j使用示例
*/
public class Log4jCase {
private static Logger logger = Logger.getLogger(Log4jCase.class); public static void main(String[] args) throws InterruptedException {
//加载配置文件
PropertyConfigurator.configure(Log4jCase.class.getClassLoader().getResource("log4j.properties"));
logger.debug("This is debug message.");
for (int i = 0; i < 1000; i++) {
logger.info("This is info message:" + i);
}
}
}

配置文件配置好,使用还是很简单的。

6.3、web应用spring整合log4j

在web.xml中增加:

    <context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.properties</param-value>
</context-param>

Java日志介绍(2)-Log4j的更多相关文章

  1. java 日志技术汇总(log4j , Commons-logging,.....)

    前言 在Tomcat 与weblogic 中的 日志(log4j) 配置系列一 在系列一 中, 有一个问题一直没有解决,就是部署到weblogic 中应用程序如何通过log4j写日志到文件中? 这里仅 ...

  2. Java学习笔记(十九)——Java 日志记录 AND log4j

    [前面的话] 学习的进度应该稍微在快一点. Java日志到了必须学习怎么使用的时候了,因为在项目中要进行使用.基础性文章,选择性阅读. [结构] java日志对调试,记录运行,问题定位都起到了很重要的 ...

  3. Java日志框架 (commons-logging,log4j,slf4j,logback)

    转自:http://blog.csdn.net/kobejayandy/article/details/17335407 如果对于commons-loging.log4j.slf4j.LogBack等 ...

  4. Java日志工具之Log4J

    Log4J与java.util.logging.Logger的使用方式出奇的相似,因此如果先看这篇文章<Java日志工具之java.util.logging.Logger>在来用Log4J ...

  5. Java日志介绍(4)-Log4j2

    Log4j2是Log4j的升级版,相比其前身Log4j 1.x提供了显著的改进,并提供了在Logback中提供的许多改进,同时修复了Logback体系结构中的一些固有问题. Log4j2的内容很多,本 ...

  6. Java日志介绍(3)-Logback

    Logback 继承自Log4j,它建立在有十年工业经验的日志系统之上.它比其它所有的日志系统更快并且更小,包含了许多独特并且有用的特性. 1.配置 1.1.加载配置 Logback能够在初始化期间自 ...

  7. Java日志框架Slf4j+Log4j入门

    一.日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的日志 ...

  8. Java日志介绍(1)-java.util.logging.Logger

    java.util.logging.Logger是JDK自带的日志工具,其简单实现了日志的功能,不是很完善,所以在实际应用中使用的比较少.本文直接用代码演示其使用方法,文中所使用到的软件版本:Java ...

  9. java日志,(commons-loging 、log4j 、slf4j 、LogBack介绍)

    如果对于commons-loging .log4j .slf4j .LogBack 等都已经非常清楚了,可以忽略本文.几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所 ...

随机推荐

  1. 四、Python文件操作

    描述:Python的文件操作涉及对文件的读/写与编码的处理. 1.两种写法 1.1 第一种 1 f = open('文件路径', '文件操作方式', encoding='utf-8') 2 对文件操作 ...

  2. 微信小程序媒体音乐API更新小记,以及音乐外链制作方法

    假期开发微信小程序玩的时候发现音乐播放功能,但是教程中的旧版API已经不能成成功打开 官方文档写的很清楚,旧版接口不再维护,使用新版接口,换API后,又出现了新的问题,虽然没有报错信息,但是播放器闪退 ...

  3. python、js实现WGS84、高德(火星)、百度坐标转换

    在日常工作学习中常会涉及到WGS84.高德(火星/谷歌).百度三种空间坐标系的坐标转换,本文将通过python.js两种语言实现坐标系的转换. 坐标系说明: wgs84:为一种大地坐标系,也是目前广泛 ...

  4. ES数据同步方案

    当业务量上升后,由于mysql对全文检索或模糊查询支持的能力不强,在系统中查询的地方,往往会出现慢sql等,拖累系统其他模块,造成性能低下. 随着ES使用普及率的升高,ES是mysql的一个有效补充. ...

  5. python正则表达式中括号的作用,形如 "(\w+)\s+\w+"

    先看一个例子: import re string="abcdefg acbdgef abcdgfe cadbgfe" #带括号与不带括号的区别 regex=re.compile(& ...

  6. 《JavaScript高级程序设计》读书笔记(三)基本概念第三小节 String、Object类型

    内容---语法 上一小节---数据类型 本小节 String类型---流程控制语句---理解函数 String类型--零个或者多个16位Unicode字符组成字符序列,即字符串--可以由双引号&quo ...

  7. C/C++程序从文本文件中读取(保存)数据

    :本文仅供初学者参阅,解惑 在C程序中: 与程序代码外的数据(文件)打交道,我们使用到流(stream)这个概念,实现进程的虚拟内存与文件之间的数据交换. ——文件流:C标准库提供了FILE(之所以命 ...

  8. js中的跨域

    因为javascript的同源策略,导致它普通情况下不能跨域,直到现在,我还是不能完全理解js跨域的几种方法,没办法,只能慢慢学习,慢慢积累,这不,几天又在园里看到一篇博文,有所收获,贴上来看看; 原 ...

  9. Pycharm 分屏

    有图由真相 效果自在眼前

  10. ArrayStack(栈)

    顺序栈即数组型的栈.什么是栈呢?简单来说就像一个刚好装的下乒乓球大小的球筒,假设不能暴力打开球筒且只有一端有出口,那你放入或取出里面的球的操作都只能在一端进行,并且把球放进去或取出来都是由顺序决定的, ...