由于最近在做提使用log4j频繁,每次都要在类的开头都要创建logger对象,于是写了一个log4j工具类。
package com.speedup.check.common; import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; /** * 日志工具类 * @author huwy * */ public class LogHelper { private static Map< String , Logger > loggerMap = new HashMap< String , Logger >(); public static void info( Object message ) { String className = getClassName(); Logger logger = getLogger( className ); logger.info( getLogPrefix() + message ); } /** * 占位符的形式 * 示例:info("%s的工具类", "log4j") == info("log4j的工具类") * @param message * @param args */ public static void info(Object message , Object ...args) { String className = getClassName(); Logger logger = getLogger( className ); logger.info( getLogPrefix() + String.format( message.toString() , args ) ); } public static void error( Exception e) { String className = getClassName(); Logger logger = getLogger( className ); logger.error( getLogPrefix() ,e ); } public static void error (Object message, Exception e) { String className = getClassName(); Logger logger = getLogger( className ); logger.error( message + getLogPrefix() + getLogExceInfo( e ) ); } /* * 获取最开始的调用者所在类 */ private static String getClassName() { StackTraceElement [] stes = Thread.currentThread().getStackTrace(); StackTraceElement ste = stes[2]; return ste.getClassName(); } /** * 获取日志前缀 */ private static String getLogPrefix () { String prefix = ""; StackTraceElement [] stacks = Thread.currentThread().getStackTrace(); prefix = stacks[3].getClassName() + "." + stacks[3].getMethodName() + ":[" + stacks[3].getLineNumber()+"]"; return prefix; } /** * 获取异常日志信息 */ private static String getLogExceInfo (Exception e) { StringWriter sw = new StringWriter(); e.printStackTrace( new PrintWriter( sw, true ) ); return sw.toString(); } /** * 根据类名获取logger对象 * @param className * @return */ private static Logger getLogger(String className) { Logger logger = null; if (loggerMap.containsKey( className )) { logger = loggerMap.get( className ); } else { try { logger = Logger.getLogger( Class.forName( className ) ); loggerMap.put( className , logger ); } catch ( Exception e ) { e.printStackTrace(); } } return logger; } }
调用示例:
public void uploadFile () { String date = DateHelper.getStr( new Date() , "yyyy-MM-dd" ); LogHelper.info("日期:%s开始上传文件" , date); //文件子目录路径 String filePath = DateHelper.getStr( new Date() , "yyyyMMdd" ); //获取文件 List< String > list = dataManager.getSoruceDataList( date ); //文件名 String fileName = bulidSoruceFileName( list ); //创建文件 TxtManager.createFile( filePath , fileName); //构造文件内容 String content = bulidSoruceContent( list ); //写入内容 TxtManager.writeFile( filePath , fileName , content ); //压缩文件 TxtManager.compressedFile( filePath , filePath , fileName); //获取文件流 InputStream is = TxtManager.getFileInputStream( filePath , fileName ); //上传文件 FtpManager.uploadFile( is , filePath , fileName ); LogHelper.info( "日期:%s上传结束", date ); }
log4j配置文件
log4j.rootLogger = DEBUG, A1, A2 log4j.appender.A1 = org.apache.log4j.ConsoleAppender log4j.appender.A1.layout = org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern = %p %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n log4j.appender.A2 = org.apache.log4j.DailyRollingFileAppender log4j.appender.A2.File = ${catalina.home}/logs/BusinessCheck/log.txt log4j.appender.A2.layout = org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern = %p %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n
相关推荐
《Log4j笔记 第九章 封装Log4j》 在Java开发中,日志记录是一项非常重要的任务,它帮助我们追踪程序运行时的状态,定位和解决错误。Log4j是Apache组织提供的一款强大的日志框架,因其高效、灵活和可配置性而广受...
这个压缩包包含了一个已经封装好的Log4j实现,使得在项目中集成和使用日志变得更加简便。 首先,我们来看看`log4j.properties`文件。这是Log4j的配置文件,它定义了日志的输出级别、格式、目的地等。例如,你可以...
Log4cxx是Apache软件基金会的一个开源项目,它是C++版的log4j,提供了一套强大的日志处理机制。本文将详细讨论如何将log4cxx封装为通用LOG宏,以及其配置文件的详细内容。 首先,让我们了解log4cxx的基本概念。Log4...
Log4j是Apache提供的一款强大的日志处理框架,它灵活且功能强大,广泛应用于各种Java项目中。本话题将深入探讨如何使用Log4j实现多文件输出打印,以及自定义日志的配置。 首先,我们要理解Log4j的基本工作原理。Log...
### log4j注释文档详解 #### 一、概述 `log4j`是一款非常流行的Java日志框架,它能够帮助开发者记录程序运行时的信息,从而便于后续的问题追踪与调试。本文档旨在对一份log4j配置文件进行详细解读,以便初学者能够...
LOG4CPP是Apache软件基金会的一个项目,它模仿了Java的LOG4J框架,为C++程序员提供了类似的功能。LOG4CPP的核心思想是层次化的日志记录,通过定义不同的日志级别(如DEBUG、INFO、WARN、ERROR和FATAL)来控制日志...
Log4cxx是Apache软件基金会提供的一款针对C++的日志库,它是Log4j的C++实现,提供了类似的功能和接口。本文将深入探讨如何基于log4cxx封装一个自定义的日志类,以便在项目中更加便捷地管理和使用日志。 首先,我们...
《深入解析Log4j 2.11.0源码》 Log4j,作为Java领域最常用的日志框架之一,其2.11.0版本的发布为开发者提供了更加强大、高效和灵活的日志处理能力。源码包的获取,对于开发者深入理解其工作原理、定制化需求以及...
首先,`log4cplus`模仿了Java中的`log4j`框架,提供了一个强大的日志处理机制。这个库的核心设计理念是模块化、可配置性和可扩展性。它允许开发者根据需要调整日志级别(如DEBUG、INFO、WARN、ERROR等),并且可以将...
#### 三、Log4J封装 为了更好地管理和使用Log4J,通常会对其进行一定的封装,以提供更加简洁易用的接口。 1. **常见封装方式:** - **工厂模式**:创建一个Logger工厂类,负责创建不同类型的Logger实例。 - **...
已经封装好,把log4j.appender.fileout=org.apache.log4j.Log4JDateAndSizeSplit 即可,其余和原api一样: log4j.appender.fileout.MaxFileSize=10240KB log4j.appender.fileout.MaxBackupIndex=20
Log4cplus是一个广泛使用的C++日志记录库,它借鉴了Java的log4j理念,为C++程序员提供了强大的日志管理功能。本文将深入探讨log4cplus封装类的原理、使用方法,并结合实际项目经验,分享其在项目中的具体应用。 一...
再者,Log4J的封装是指将Log4J的功能融入到自定义的类库或框架中,以便在整个项目中统一日志处理。封装可以创建一个简单的日志接口,内部调用Log4J的方法,使得代码更加简洁且易于维护。同时,封装也有助于在未来...
6. **事件数据结构**:Log4j2使用LogEvent对象封装日志信息,使其更易于处理和过滤。 7. **日志级别的优先级**:Log4j2允许设置每个Logger的优先级,便于控制日志输出的详细程度。 8. **自动重加载配置**:如果...
这个压缩包“log4j.jar.rar”包含的是Log4j的核心库文件“log4j.jar”,这是一个Java Archive (JAR) 文件,用于封装和分发Java类、资源以及元数据。Log4j的目的是提供一种灵活且高性能的方式来处理应用程序中的日志...
5. **日志事件模型**:Log4j 2使用`LogEvent`对象来封装日志信息,包括日志级别、消息、时间戳等。源码中的`LogEventFactory`和`Log4jLogEvent`类揭示了日志事件的创建和处理流程。 6. **错误处理与回退策略**:当...
### log4j从入门到详解 #### 1. Log4j简介 Log4j是一款由Apache组织提供的开源日志组件,被广泛应用于Java应用程序中。它可以帮助开发者在应用程序中记录日志信息,这对于调试程序、追踪错误以及进行系统监控等...