`
sw1982
  • 浏览: 511407 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

扩展log4j系列[二]动态、分文件记log

阅读更多

一。背景分析      

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实用配置扩展

    log4j的主要优势在于其灵活性和可扩展性,允许用户通过配置文件自定义日志记录的方式,无需修改应用程序代码。 #### 二、日志记录的目的 在应用程序中记录日志主要有以下三个目的: 1. **监视代码中变量的变化...

    log4j.jar包,和log4j.properties配置文件下载

    在"Log4j.jar包,和log4j.properties属性文件打包下载"中,我们有两个关键组成部分: 1. **Log4j.jar**:这是Log4j的主要库文件,包含了所有必需的类和方法,使得程序员能够方便地在代码中插入日志语句。它提供了...

    log4j使用jar包和log4j.properties配置文件

    Log4j是Apache组织提供的一款广泛使用的Java日志框架,因其灵活性、高效性和可扩展性而备受青睐。本文将详细探讨Log4j的使用,主要关注1.2.17版本的jar包以及配置文件`log4j.properties`。 ### 1. Log4j简介 Log4j...

    log4j记录压缩日记

    `ZipDailyRollingFileAppender.java` 是Log4j中的一个类,它扩展了`DailyRollingFileAppender`,并添加了对日志文件的ZIP压缩功能。这个类会在每天结束时生成一个新的日志文件,并对旧的日志文件进行压缩,以此实现...

    Log4j2简介及与Log4j效率对比

    - **日志文件写入速度**:Log4j2通过优化的布局(Layout)和过滤器(Filter),实现了更快的日志文件写入速度。这对于大数据量的日志记录尤为重要。 综上所述,Log4j2在效率方面较Log4j 1.x有了显著提升,这主要得益...

    log4j示例项目

    在Log4j项目中,通常会有一个`log4j.properties`或`log4j.xml`配置文件,用于定义日志行为。例如: ```properties # log4j.properties 示例 log4j.rootLogger=DEBUG, stdout, FILE log4j.appender.stdout=org....

    Log4j2学习log4j2.xml配置模板

    Log4j2 配置模板学习笔记 Log4j2 是 Java 语言中一种流行的日志记录工具,它提供了灵活的日志记录管理功能。...*可扩展性强:Log4j2 提供了非常强的可扩展性,可以根据需要添加新的 appender 和配置。

    log4j-api-2.12.4.ja和log4j-core-2.12.4.jar

    配置Log4j通常通过一个XML或JSON格式的配置文件完成,例如`log4j2.xml`或`log4j2.json`,这个文件定义了日志的输出级别、目的地(如控制台、文件、数据库等)以及格式。 总的来说,Log4j 2是Java开发中不可或缺的...

    java中log4j的扩展写法

    本文将基于给定文件信息中的描述,详细介绍如何对Log4j进行扩展以支持Struts、iBatis以及自定义日志输出。 #### 二、Log4j配置详解 ##### 2.1 配置文件结构 Log4j的配置文件通常为.properties格式,用于定义日志...

    log4j的jar包和配置文件

    Log4j是Apache组织提供的一款开源日志框架,它具有高效、灵活、可扩展的特点,广泛应用于各种Java项目中,包括Mybatis这样的持久层框架。 ### 1. Log4j的基本组件 - **Logger**: 日志记录器是Log4j的核心组件,...

    log4j-api-2.17.1.jar和log4j-core-2.17.1.jar

    这个库实现了log4j-api中定义的接口,提供了具体的功能,比如各种Appender(控制台输出、文件写入、网络传输等)、Layout(日志格式化)、Filter(日志过滤)和Lookup(动态配置变量解析)。例如,`org.apache....

    log4j乱码问题解决办法

    本文将详细介绍如何通过修改`log4j.properties`配置文件来解决log4j中的乱码问题。 #### 二、问题背景 在使用log4j时,经常会在控制台或日志文件中看到乱码,尤其是在涉及中文字符的情况下。这通常是由于日志系统...

    log4j-API-最新稳定版本log4j-1.2.17

    6. **配置文件**:Log4j通常通过配置文件(如log4j.properties或log4j.xml)来设置其行为,包括定义日志器、appender和layout。 7. **MDC(Mapped Diagnostic Context)和NDC(Nested Diagnostic Context)**:这两...

    logging-log4j2-log4j-2.15.0-rc2.zip

    总之,logging-log4j2-log4j-2.15.0-rc2版本不仅在安全性上达到了新的高度,还通过一系列改进和优化,确保了日志处理的高效性和灵活性。对于开发者来说,深入理解和掌握这一版本的Log4j,将有助于构建更加健壮、安全...

    log4j jar包 和配置文件

    标题"Log4j jar包 和配置文件"指的是Java日志记录库Log4j的一个特定版本——1.2.17。Log4j是Apache软件基金会开发的一个开源项目,它为Java应用程序提供了强大的日志记录功能。这里的"jar包"即Java Archive,是Java...

    Log4j2、Fastjson、Log4j的BurpSuite插件亲测有效

    Log4j2作为Log4j的升级版本,它在性能、可配置性和可扩展性上有了显著提升,同时也修复了Log4j的一些已知问题。Fastjson则是阿里巴巴的一个开源项目,它提供了快速的JSON解析和生成性能,广泛应用于Java应用程序的...

    Log4j的扩展

    Java开发中使用Log4j 来记录log非常的方便,但是出现问题时需要查询Log时是很痛的,因为Log4j只提供了将Log记录的文件的方法却没有将文件分开来记录。如果Log时间很长的问题那就麻烦了。特此扩展了Log4j 中的...

    (转)如何自建appender扩展Log4j框架

    5. **注册Appender**:在Log4j的配置文件(如log4j.properties或log4j.xml)中,声明你的自定义Appender,并配置相关属性。例如: ```xml &lt;layout class="org.apache.log4j.PatternLayout"&gt; ``` 6. *...

    log4j-2.17.1的jar包,导入即可使用

    4. **配置文件**:Log4j 的行为可以通过配置文件(通常是`log4j2.xml`或`log4j2.json`)进行定制。配置文件可以定义日志级别(如TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF),日志输出目的地(控制台、文件、...

    log4j使用手册和配置文件实例

    Log4j的配置文件通常是`log4j.properties`或`log4j.xml`,用于设置日志器、输出器和布局等相关属性。以下是一些基本配置示例: ```properties # 配置控制台输出 log4j.rootLogger=DEBUG, Console log4j.appender....

Global site tag (gtag.js) - Google Analytics