Log4j自已配置

xiaoxiao2022-06-23  62

配置方法:

导入log4j包。

log4j.properties文件内容

# set log levels # log4j.rootLogger = debug , stdout log4j.logger.newLoger = stdout,debug,info,warn,error,MAIL # 输出到控制台 # log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.Threshold = DEBUG log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n # 输出到文件:DEBUG # log4j.appender.debug = org.apache.log4j.DailyRollingFileAppender log4j.appender.debug.File =log/debug.txt log4j.appender.debug.Append = false log4j.appender.debug.Threshold = DEBUG log4j.appender.debug.layout = org.apache.log4j.PatternLayout log4j.appender.debug.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n # 输出到文件:INFO # log4j.appender.info = org.apache.log4j.DailyRollingFileAppender log4j.appender.info.File =log/info.txt log4j.appender.info.Append = false log4j.appender.info.Threshold = INFO log4j.appender.info.layout = org.apache.log4j.PatternLayout log4j.appender.info.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n # 输出到文件:WARN # log4j.appender.warn = org.apache.log4j.DailyRollingFileAppender log4j.appender.warn.File =log/warn.txt log4j.appender.warn.Append = false log4j.appender.warn.Threshold = WARN log4j.appender.warn.layout = org.apache.log4j.PatternLayout log4j.appender.warn.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n # 输出到文件:ERROR # log4j.appender.error = org.apache.log4j.DailyRollingFileAppender log4j.appender.error.File =log/error.txt log4j.appender.error.Append = false log4j.appender.error.Threshold = ERROR log4j.appender.error.layout = org.apache.log4j.PatternLayout log4j.appender.error.layout.ConversionPattern = [%d{yyyy-MM-dd HH:mm:ss}] [%5p] [%C:%L] -> %m%n # 邮件发送:MAIL # #发送mail需下载及引入activation.jar和mail.jar log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=ERROR log4j.appender.MAIL.BufferSize=512 log4j.appender.MAIL.From=luweifeng1983@126.com log4j.appender.MAIL.SMTPUsername=luweifeng1983 log4j.appender.MAIL.SMTPPassword=** log4j.appender.MAIL.SMTPHost=smtp.126.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=luweifeng@sz.tom.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

 

测试代码:

package com.log; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; public class TestLog { static Logger logger = Logger.getLogger(TestLog.class); /** * @param args */ public static void main(String[] args) { PropertyConfigurator.configure("./config/log4j.properties"); Logger logger = Logger.getLogger("newLoger"); logger.debug("debug..."); logger.info("info...."); logger.warn("warn....."); logger.error("error出错啦..."); } }

 

上面配置中控制台只输出信息:

[2016-08-16 14:06:37] [DEBUG] [com.log.TestLog:14] -> debug...[2016-08-16 14:06:37] [ INFO] [com.log.TestLog:15] -> info....[2016-08-16 14:06:37] [ WARN] [com.log.TestLog:16] -> warn.....[2016-08-16 14:06:37] [ERROR] [com.log.TestLog:17] -> error出错啦...

 

以下进行error日志记录保存到数据库,采用xml配置文件:

log4j.xml如下:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" threshold="debug"> <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %5p %c{2}: %m%n" /> </layout> </appender> <appender name="FILE" class="org.apache.log4j.RollingFileAppender"> <param name="file" value="c:/framework/log/all/all.log" /> <param name="append" value="true" /> <param name="maxFileSize" value="10MB" /> <param name="maxBackupIndex" value="100" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p %C{6} (%F:%L) - %m%n" /> </layout> </appender> <appender name="info" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="c:/framework/log/info/info.log" /> <param name="Encoding" value="GB2312" /> <param name="DatePattern" value="'.'yyyy-MM-dd'.bak'" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="INFO" /> <param name="LevelMax" value="INFO" /> <param name="acceptOnMatch" value="true" /> </filter> </appender> <appender name="error" class="org.apache.log4j.DailyRollingFileAppender"> <param name="threshold" value="error" /> <param name="File" value="c:/framework/log/error/error.log" /> <param name="Encoding" value="GB2312" /> <param name="DatePattern" value="'.'yyyy-MM-dd'.bak'" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="error" /> <param name="LevelMax" value="error" /> <param name="acceptOnMatch" value="true" /> </filter> </appender> <appender name="debug" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="c:/framework/log/debug/debug.log" /> <param name="Encoding" value="GB2312" /> <param name="DatePattern" value="'.'yyyy-MM-dd'.bak'" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value=" %d{ISO8601} [%c]- %m%n" /> </layout> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="debug" /> <param name="LevelMax" value="debug" /> <param name="acceptOnMatch" value="true" /> </filter> </appender> <appender name="dberror" class="org.apache.log4j.jdbc.JDBCAppender"> <param name="URL" value="jdbc\:oracle\:thin\:@//10.101.2.19\:1521/pdbqmytcis" /> <param name="driver" value="oracle.jdbc.driver.OracleDriver"/> <param name="user" value="qmytcis"/> <param name="password" value="qmytcis123"/> <param name="sql" value="INSERT INTO ERROR_LOG (ID,ERROR_TIME,ERROR_THREAD,ERROR_CLASS,ERROR_MSG) VALUES (SEQ_ERROR_LOG.NEXTVAL,'%d{yyyy-MM-dd HH\:mm\:ss}', '[YTCIS_WEB]%t', '%l', '%.4000m') "/> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="error" /> <param name="LevelMax" value="error" /> <param name="acceptOnMatch" value="true" /> </filter> </appender> <appender name="mydberror" class="com.log.MyJDBCAppender"> <param name="URL" value="jdbc\:oracle\:thin\:@//10.101.2.19\:1521/pdbqmytcis" /> <param name="driver" value="oracle.jdbc.driver.OracleDriver"/> <param name="user" value="qmytcis"/> <param name="password" value="qmytcis123"/> <param name="sql" value="INSERT INTO ERROR_LOG (ID,ERROR_TIME,ERROR_THREAD,ERROR_CLASS,ERROR_MSG) VALUES (SEQ_ERROR_LOG.NEXTVAL,'%d{yyyy-MM-dd HH\:mm\:ss}', '[YTCIS_WEB]%t', '%l', '%.4000m') "/> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="LevelMin" value="error" /> <param name="LevelMax" value="error" /> <param name="acceptOnMatch" value="true" /> </filter> </appender> <!-- 下面是打印mybatis语句的配置--> <logger name="com.gov.customs" additivity="false"> <level value="DEBUG" /> <appender-ref ref="debug"/> <appender-ref ref="info"/> <appender-ref ref="error"/> <appender-ref ref="CONSOLE"/> </logger> <logger name="java.sql" additivity="true"> <level value="DEBUG" /> <appender-ref ref="CONSOLE"/> </logger> <root> <level value="DEBUG" /> <!-- <appender-ref ref="CONSOLE" /> <appender-ref ref="debug" /> <appender-ref ref="FILE" /> <appender-ref ref="info" /> <appender-ref ref="error" /> <appender-ref ref="dberror" /> --> <appender-ref ref="mydberror" /> </root> </log4j:configuration>

 

因为日志内容可能有引号等字符导致入库失败,所以需要进行以下处理:

MyJDBCAppender类

package com.log; import org.apache.log4j.Category; import org.apache.log4j.Priority; import org.apache.log4j.jdbc.JDBCAppender; import org.apache.log4j.spi.LoggingEvent; public class MyJDBCAppender extends JDBCAppender { protected String getLogStatement(LoggingEvent event) { String fqnOfCategoryClass=event.fqnOfCategoryClass; Category logger=Category.getRoot(); Priority level=event.level; Object message=event.getMessage(); Throwable throwable=null; MyLoggingEvent bEvent=new MyLoggingEvent(fqnOfCategoryClass,logger,level,message,throwable); bEvent.setEvent(event); return super.getLogStatement(bEvent); } }

 MyLoggingEvent类

package com.log; import org.apache.log4j.Category; import org.apache.log4j.Priority; import org.apache.log4j.spi.LoggingEvent; public class MyLoggingEvent extends LoggingEvent { private static final long serialVersionUID = 1L; private LoggingEvent event = null; public MyLoggingEvent(String fqnOfCategoryClass, Category logger, Priority level, Object message, Throwable throwable) { super(fqnOfCategoryClass, logger, level, message, throwable); } public String getThreadName() { String thrdName=super.getThreadName(); if(thrdName.indexOf("'")!=-1){ thrdName=thrdName.replaceAll("'", "''"); } return thrdName; } public String getRenderedMessage() { String msg=super.getRenderedMessage(); String throwMsgs = ""; String [] throwMsg = event.getThrowableStrRep(); if (throwMsg != null) { StringBuffer buf = new StringBuffer(); for(int i = 0; i < throwMsg.length; i++) { buf.append(throwMsg[i]); buf.append("\r\n"); } throwMsgs = buf.toString(); } msg = msg + "\r\n" + throwMsgs; if(msg.indexOf("'")!=-1){ msg=msg.replaceAll("'", "''"); } if(msg.length()>4000) msg = msg.substring(0,4000); return msg; } public LoggingEvent getEvent() { return event; } public void setEvent(LoggingEvent event) { this.event = event; } }

 测试类TestLog

package com.log; import java.io.IOException; import java.io.InterruptedIOException; import java.io.LineNumberReader; import java.io.PrintWriter; import java.io.StringReader; import java.io.StringWriter; import java.net.URL; import java.util.ArrayList; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; import org.apache.log4j.xml.DOMConfigurator; import com.other.Other; public class TestLog { static Logger logger = Logger.getLogger(TestLog.class); /** * @param args */ public static void main(String[] args) { try { testXml(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // Other o = new Other(); // o.print(); } public static void testProperties(){ PropertyConfigurator.configure("./config/log4j.properties"); Logger logger = Logger.getLogger("newLoger"); logger.debug("debug..."); logger.info("info...."); logger.warn("warn....."); logger.error("error出错啦..."); } public static void testXml() throws Exception{ // final URL url = TestLog.class.getResource("log4j.xml"); URL url = new URL("./config/log4j.xml"); DOMConfigurator.configure(url); int c; try { int a = 3; int b = 0; c = a / b; String s = "3232323".substring(0,2); } catch (Exception e) { e.printStackTrace(); //render(e); logger.error("error出错啦...",e); } } public static String[] render(final Throwable throwable) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); try { throwable.printStackTrace(pw); } catch(RuntimeException ex) { } pw.flush(); LineNumberReader reader = new LineNumberReader( new StringReader(sw.toString())); ArrayList lines = new ArrayList(); try { String line = reader.readLine(); while(line != null) { lines.add(line); line = reader.readLine(); } } catch(IOException ex) { if (ex instanceof InterruptedIOException) { Thread.currentThread().interrupt(); } lines.add(ex.toString()); } String[] tempRep = new String[lines.size()]; lines.toArray(tempRep); return tempRep; } }

ORACLE数据库表脚本如下:

-- Create table create table ERROR_LOG ( ID NUMBER, ERROR_TIME VARCHAR2(50), ERROR_THREAD VARCHAR2(500), ERROR_CLASS VARCHAR2(500), ERROR_MSG VARCHAR2(4000) ); create sequence SEQ_ERROR_LOG minvalue 1 start with 1 increment by 1;

 

 运行测试类,记录错误日志内容

具体见附件包。

相关资源:Java 面经手册·小傅哥(公众号:bugstack虫洞栈).pdf
转载请注明原文地址: https://www.6miu.com/read-4952940.html

最新回复(0)