網上關於LOG4J的使用文章太多了,寫這篇文章的目的一方面是爲了回顧LOG4J的用法,一方面針對配置的使用自動將日誌插入數據庫,自動發送郵件,還有就是自定義輸入實現。後續文章會總結下從LOG4J到LOG4J2,再到logback,從commons-logging到sl4j。php
LOG4J(也就是一般全部的log4j1)是Apache軟件基金會下面的一個項目,同時也是Apache Logging項目的一部分,Apache Logging包括:Apache Log4j 2,Apache log4php,Apache log4net,Apache chainsaw,Apache log4j 1,Apache log4cxx,Apache log4j 1 extras 。經過使用Log4j,咱們能夠控制日誌信息輸送的目的地是控制檯、文件、GUI組件、甚至是套接口服務器、NT的事件記錄器、UNIX Syslog守護進程等;咱們也能夠控制每一條日誌的輸出格式;經過定義每一條日誌信息的級別,咱們可以更加細緻地控制日誌的生成過程。最使人感興趣的就是,這些能夠經過一個配置文件來靈活地進行配置,而不須要修改應用的代碼.html
import org.apache.log4j.Logger; public class Log4JTest { private static final Logger log = Logger.getLogger(Log4JTest.class);//日誌文件
//private static final Logger log = Logger.getLogger("appender");//日誌文件 public static void main(String[] args) { log.debug("DEBUG"); log.warn("WARN"); log.info("INFO"); log.error("ERROR"); log.fatal("FATAL"); } }
從上面能夠看出日誌級別包括:TRACE,DEBUG,INFO,WARN,ERROR 和FATAL。關於日誌的級別這裏就不在贅述。java
Log4j支持兩種格式的配置文件:Log4j 支持兩種配置文件格式,一種是 XML 格式的文件,一種是 Java 特性文件 lg4j.properties (鍵 = 值),properties文件簡單易讀,xml文件能夠配置更多的功能(好比過濾)。mysql
若是採用log4j輸出日誌,要對log4j加載配置文件的過程有所瞭解。log4j啓動時,默認會尋找source folder下的log4j.xml配置文件,若沒有,會尋找log4j.properties文件,而後加載配置。 還能夠經過程序的方式手動加載PropertyConfigurator.configure("config/log4j.properties");若是在WEB開發中和Spring集成,還能夠經過經過在XML中下列方式來指定具體位置。web
<!-- log4jConfigLocation:log4j配置文件存放路徑 --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/conf/log4j.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
XML配置文件方式spring
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <!-- 控制檯的日誌記錄 --> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-5p: %c - %m%n" /> </layout> </appender> <!-- 文件的日誌記錄 --> <appender name="file" class="org.apache.log4j.DailyRollingFileAppender"> <param name="File" value="${webapp.root}/logs/testdata.log" /> <param name="Append" value="true" /> <param name="DatePattern" value="'.'yyyy-MM-dd" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss,SSS} [%-5p]: %c - %m%n" /> </layout> </appender> <!-- name要對應字節碼文件所在的包路徑,只會記錄該包路徑下的代碼的日誌 --> <logger name="com.bocloud"> <level value="debug,info,error" /> <appender-ref ref="file"/> <appender-ref ref="console" /> </logger> <!-- Root Logger --> <root> <priority value="debug" /> <appender-ref ref="console" /> </root> </log4j:configuration>
屬性配置文件:log4j.propertiessql
log4j.rootLogger=TRACE,CONSOLE,A1,MAIL,DATABASE,CUNSTOM log4j.addivity.org.apache=true # 應用於控制檯 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.Threshold=DEBUG log4j.appender.CONSOLE.Target=System.out log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n #log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n #應用於文件 log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=file.log log4j.appender.FILE.MaxFileSize=100MB log4j.appender.FILE.Append=true log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n # Use this layout for LogFactor 5 analysis # 應用於文件回滾 log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender log4j.appender.ROLLING_FILE.Threshold=ERROR log4j.appender.ROLLING_FILE.File=rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=10KB log4j.appender.ROLLING_FILE.MaxBackupIndex=1 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n #應用於socket log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n # 發送日誌給郵件 log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=xxxxxxxx log4j.appender.MAIL.SMTPHost=smtp.qq.com log4j.appender.MAIL.SMTPUsername=xxxxxxxx log4j.appender.MAIL.SMTPPassword=xxxxxxxxxxxxxxxx log4j.appender.MAIL.Subject=Log4J Message錯誤日誌發送 log4j.appender.MAIL.SMTPDebug=false log4j.appender.MAIL.To=xxxxxxxx@qq.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n # 用於數據庫 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver log4j.appender.DATABASE.user=root log4j.appender.DATABASE.password=root log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n # 天天創建日誌 log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=dailyFile.log log4j.appender.A1.Encoding=GBK log4j.appender.A1.Threshold=DEBUG log4j.appender.A1.DatePattern='.'yyyy-MM-dd log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n #自定義Appender log4j.appender.CUNSTOM = com.ifengxy.loggerTest.appender.CustomAppender log4j.appender.CUNSTOM.host = mail.cybercorlin.net log4j.appender.CUNSTOM.userName = userName log4j.appender.CUNSTOM.passWord = passWord log4j.appender.CUNSTOM.recipient = corlin@cybercorlin.net log4j.appender.CUNSTOM.layout=org.apache.log4j.PatternLayout log4j.appender.CUNSTOM.layout.ConversionPattern =[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n
使用log4j主要配置包括:數據庫
1.日誌記錄器(Loggers):控制要輸出哪些日誌記錄語句,對日誌信息進行級別限制。apache
在上面的配置文件中:log4j.rootLogger=DEBUG, CONSOLE, FILE ----- 配置根Logger,等號後的第一個單詞DEBUG表明輸出等級(等級共有5種FATAL ERRORWARN INFO DEBUG,越日後輸出越詳細,按順序每個等級都包含前面的全部輸出並屏蔽後面的全部輸出。每在rootLogger配置一個輸入目的地,那麼就須要相應的後面定義這些目的地的定義。具體見示例。api
2.輸出端(Appenders):指定了日誌將打印到控制檯仍是文件中。Log4j提供的appender有如下幾種:
org.apache.log4j.ConsoleAppender(控制檯) org.apache.log4j.FileAppender(文件) org.apache.log4j.DailyRollingFileAppender(天天產生一個日誌文件) org.apache.log4j.RollingFileAppender(文件大小到達指定尺寸的時候產生新文件) org.apache.log4j.WriterAppender(將日誌信息以流格式發送到任意指定的地方)
3.日誌格式化器(Layout):控制日誌信息的顯示格式。
log4j提供如下4種佈局樣式: org.apache.log4j.HTMLLayout(以HTML表格形式佈局) org.apache.log4j.PatternLayout(能夠靈活地指定佈局模式,就是能夠自定義輸出樣式), org.apache.log4j.SimpleLayout(包含日誌信息的級別和信息字符串), org.apache.log4j.TTCCLayout(包含日誌產生的時間、線程、類別等等信息)
針對PatternLayout佈局,咱們能夠經過靈活定製輸出格式:log4j.appender.CONSOLE.layout.ConversionPattern=%d{MM-ddHH:mm:ss}[%c-%L][%t][%-4r] - %m%n
其中格式參數定義以下所示:
%m 輸出代碼中指定的消息 %p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL %r 輸出自應用啓動到輸出該log信息耗費的毫秒數 %c 輸出所屬的類目,一般就是所在類的全名 %t 輸出產生該日誌事件的線程名 %n 輸出一個回車換行符,Windows平臺爲「\r\n」,Unix平臺爲「\n」,也就是一跳消息佔用一行 %d 輸出日誌時間點的日期或時間,緊跟一對花括號進行自定義格式 %c 輸出所屬的類目,一般就是所在類的全名 %l 精確到行 %x 輸出對齊
配置以下:
# 用於數據庫
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=root
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n
須要配置的參數包括數據庫地址,驅動名稱,數據庫的用戶名以及密碼!!須要注意是必定要添加數據庫驅動jar包,我添加的是:mysql-connector-java-5.1.37.jar,這樣纔會起做用。sql表示向數據庫中插入記錄的語句,須要首先在數據庫中創建相應的日誌表,好比個人這個例子中表名是LOG4J ,字段是Message。
配置以下:
# 發送日誌給郵件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=xxxxxxxx
log4j.appender.MAIL.SMTPHost=smtp.qq.com
log4j.appender.MAIL.SMTPUsername=xxxxxxxx
log4j.appender.MAIL.SMTPPassword=xxxxxxxxxxxxxxxx
log4j.appender.MAIL.Subject=Log4J Message錯誤日誌發送
log4j.appender.MAIL.SMTPDebug=false
log4j.appender.MAIL.To=xxxxxxxx@qq.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n
參數須要:郵件的名稱,服務地址,用戶名,密碼,還有就是郵件名稱。須要注意的是必定要添加javamail的jar包。我添加的是:mail-1.4.jar。
import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.spi.LoggingEvent; public class CustomAppender extends AppenderSkeleton { private String userName; private String host; private String passWord; private String recipient; public void close() { // TODO Auto-generated method stub } public boolean requiresLayout() { // TODO Auto-generated method stub return false; } @Override protected void append(LoggingEvent event) { // TODO Auto-generated method stub } public String getUserName() { return userName; } public String getHost() { return host; } public String getPassWord() { return passWord; } public String getRecipient() { return recipient; } public void setUserName(String userName) { this.userName = userName; } public void setHost(String host) { this.host = host; } public void setPassWord(String passWord) { this.passWord = passWord; } public void setRecipient(String recipient) { this.recipient = recipient; } }
#自定義Appender
log4j.appender.CUNSTOM = com.ifengxy.loggerTest.appender.CustomAppender
log4j.appender.CUNSTOM.host = mail.test.com
log4j.appender.CUNSTOM.userName = userName
log4j.appender.CUNSTOM.passWord = passWord
log4j.appender.CUNSTOM.recipient =test
log4j.appender.CUNSTOM.layout=org.apache.log4j.PatternLayout
log4j.appender.CUNSTOM.layout.ConversionPattern =[LOG4J_LOGGER] %d - %c -%-4r [%t] %-5p %c %x - %m%n
上面對log4j的用法作了個簡單的總結,其中涉及的知識點主要是在實戰中用到的。並未涉及全面的知識點,也主要是工做須要用到的一些。接下來會對其餘的日誌系統作個簡單說明。