一。背景分析
log4j 即便配置到炉火纯青,也无法回避大家面临的日志问题:
1.单个文件无法装下足够的log。曾经在IDC繁忙时,一个10M的log文件只可以支撑不到2分钟, 最大滚10个的话,那么20分钟以前出现的bug就找不到日志了。
2.都往一个地方记,不同模块的人记录内容不均,有的人一个操作打一屏log,有的人异常了都不记日志。。不好管理。
3. 如此快速的日志滚动,通过tail -f 去观察简直就是一个悲剧。
二。具体实现
这里提到的分文件记log,不是在log4j.properties里面一个个类的去指定输出到哪个文件。。这样每次修改、新增模块都需要改配置,而且不能动态的把一系列操作的日志轨迹串联起来。
1.下面分析了一下log4j几个核心类的关系,注意我们调用得最多的Logger对象(Category这个类已经被子类Logger代替,并且不推荐使用)
它从根类继承了这么一个犀利的方法:addAppender , 我们可以在Logger实例化的时候,顺带给它加上自己定制的appender
/**
Add <code>newAppender</code> to the list of appenders of this
Category instance.
<p>If <code>newAppender</code> is already in the list of
appenders, then it won't be added again.
*/
synchronized
public
void addAppender(Appender newAppender) {
if(aai == null) {
aai = new AppenderAttachableImpl();
}
aai.addAppender(newAppender);
repository.fireAddAppenderEvent(this, newAppender);
}
2.那么appender有什么好玩意呢?看起来真的很一般,但是它的子类FileAppender就 NB了,注意,有带fileName参数的构造器!!想把日志写到哪个文件,就看你是否会犀利的构造FileAppender了。
public class FileAppender extends WriterAppender {
protected boolean bufferedIO = false;
protected int bufferSize = 8*1024;
FileAppender() {
}
public
FileAppender(Layout layout, String filename, boolean append, boolean bufferedIO,
int bufferSize) throws IOException {
this.layout = layout;
this.setFile(filename, append, bufferedIO, bufferSize);
}
public
FileAppender(Layout layout, String filename, boolean append)
throws IOException {
this.layout = layout;
this.setFile(filename, append, false, bufferSize);
}
public
FileAppender(Layout layout, String filename) throws IOException {
this(layout, filename, true);
}
3.总结一下:
看起来是这样:在logger第一次初始化的时候,添加我自己的fileappender,
public void logXXX(String busiModule, Object message) {
String logName = "runtime."+busiModule; //log的name
org.apache.log4j.Logger logger = Log4jFactory.getInstance(logName);
if (logger.getAppender(logName) == null) {
initMyAppender(logName, busiModule+".log", logger);
}
* 初始化方法里面,使用了带指定filename参数的Fileappender,赋予appender单独的文件。
* @param appenderName
* @param logFileName
* @param log
*/
private void initMyAppender(String appenderName, String logFileName, org.apache.log4j.Logger log) {
try {
//1.创建log文件目录
File fileDir = new File(LogDir);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
//2.创建appender
RollingFileAppender fileAppender;
PatternLayout patternLayout = new PatternLayout();
patternLayout.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %m%n");
fileAppender = new RollingFileAppender(patternLayout, LogDir+logFileName);
fileAppender.setMaxFileSize(maxFileSize);
fileAppender.setMaxBackupIndex(maxBackupIndex);
fileAppender.setName(appenderName);
log.addAppender(fileAppender);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
那么在使用的时候,除了记录的消息对象,还需要额外提供一个String字段的model,相同的model导致相同的logger对象,会记录在一个文件;不同的model参数会使得日志分开记录到各自文件。关于这个参数,通常有两种提供方案:
1.选择包名的某个单词,比如"item","deal"传入,这样就是分业务模块记录。
2.使用ThreadLoacl,将用户访问的session做model,这样就可以在一个文件中完整记录用户访问的所有轨迹。
以上两种方案的model则,还以进一步通过封装到接口中,使得调用者无需关心具体model值。
FAQ:
1.addApender,每个log那不是有多个appender了么?用文件记录岂不是会写多份,耗IO的。。
~~请大家关心一下log4j的这个属性additivity:(#log4j.additivity.runtime=false)
more???
- 大小: 42.7 KB
分享到:
相关推荐
log4j的主要优势在于其灵活性和可扩展性,允许用户通过配置文件自定义日志记录的方式,无需修改应用程序代码。 #### 二、日志记录的目的 在应用程序中记录日志主要有以下三个目的: 1. **监视代码中变量的变化...
在"Log4j.jar包,和log4j.properties属性文件打包下载"中,我们有两个关键组成部分: 1. **Log4j.jar**:这是Log4j的主要库文件,包含了所有必需的类和方法,使得程序员能够方便地在代码中插入日志语句。它提供了...
Log4j是Apache组织提供的一款广泛使用的Java日志框架,因其灵活性、高效性和可扩展性而备受青睐。本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j...
`ZipDailyRollingFileAppender.java` 是Log4j中的一个类,它扩展了`DailyRollingFileAppender`,并添加了对日志文件的ZIP压缩功能。这个类会在每天结束时生成一个新的日志文件,并对旧的日志文件进行压缩,以此实现...
- **日志文件写入速度**:Log4j2通过优化的布局(Layout)和过滤器(Filter),实现了更快的日志文件写入速度。这对于大数据量的日志记录尤为重要。 综上所述,Log4j2在效率方面较Log4j 1.x有了显著提升,这主要得益...
在Log4j项目中,通常会有一个`log4j.properties`或`log4j.xml`配置文件,用于定义日志行为。例如: ```properties # log4j.properties 示例 log4j.rootLogger=DEBUG, stdout, FILE log4j.appender.stdout=org....
Log4j2 配置模板学习笔记 Log4j2 是 Java 语言中一种流行的日志记录工具,它提供了灵活的日志记录管理功能。...*可扩展性强:Log4j2 提供了非常强的可扩展性,可以根据需要添加新的 appender 和配置。
配置Log4j通常通过一个XML或JSON格式的配置文件完成,例如`log4j2.xml`或`log4j2.json`,这个文件定义了日志的输出级别、目的地(如控制台、文件、数据库等)以及格式。 总的来说,Log4j 2是Java开发中不可或缺的...
本文将基于给定文件信息中的描述,详细介绍如何对Log4j进行扩展以支持Struts、iBatis以及自定义日志输出。 #### 二、Log4j配置详解 ##### 2.1 配置文件结构 Log4j的配置文件通常为.properties格式,用于定义日志...
Log4j是Apache组织提供的一款开源日志框架,它具有高效、灵活、可扩展的特点,广泛应用于各种Java项目中,包括Mybatis这样的持久层框架。 ### 1. Log4j的基本组件 - **Logger**: 日志记录器是Log4j的核心组件,...
这个库实现了log4j-api中定义的接口,提供了具体的功能,比如各种Appender(控制台输出、文件写入、网络传输等)、Layout(日志格式化)、Filter(日志过滤)和Lookup(动态配置变量解析)。例如,`org.apache....
本文将详细介绍如何通过修改`log4j.properties`配置文件来解决log4j中的乱码问题。 #### 二、问题背景 在使用log4j时,经常会在控制台或日志文件中看到乱码,尤其是在涉及中文字符的情况下。这通常是由于日志系统...
6. **配置文件**:Log4j通常通过配置文件(如log4j.properties或log4j.xml)来设置其行为,包括定义日志器、appender和layout。 7. **MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)**:这两...
总之,logging-log4j2-log4j-2.15.0-rc2版本不仅在安全性上达到了新的高度,还通过一系列改进和优化,确保了日志处理的高效性和灵活性。对于开发者来说,深入理解和掌握这一版本的Log4j,将有助于构建更加健壮、安全...
标题"Log4j jar包 和配置文件"指的是Java日志记录库Log4j的一个特定版本——1.2.17。Log4j是Apache软件基金会开发的一个开源项目,它为Java应用程序提供了强大的日志记录功能。这里的"jar包"即Java Archive,是Java...
Log4j2作为Log4j的升级版本,它在性能、可配置性和可扩展性上有了显著提升,同时也修复了Log4j的一些已知问题。Fastjson则是阿里巴巴的一个开源项目,它提供了快速的JSON解析和生成性能,广泛应用于Java应用程序的...
Java开发中使用Log4j 来记录log非常的方便,但是出现问题时需要查询Log时是很痛的,因为Log4j只提供了将Log记录的文件的方法却没有将文件分开来记录。如果Log时间很长的问题那就麻烦了。特此扩展了Log4j 中的...
5. **注册Appender**:在Log4j的配置文件(如log4j.properties或log4j.xml)中,声明你的自定义Appender,并配置相关属性。例如: ```xml <layout class="org.apache.log4j.PatternLayout"> ``` 6. *...
4. **配置文件**:Log4j 的行为可以通过配置文件(通常是`log4j2.xml`或`log4j2.json`)进行定制。配置文件可以定义日志级别(如TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF),日志输出目的地(控制台、文件、...
Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,用于设置日志器、输出器和布局等相关属性。以下是一些基本配置示例: ```properties # 配置控制台输出 log4j.rootLogger=DEBUG, Console log4j.appender....