Heim  >  Artikel  >  Java  >  Verwenden Sie Log4j, um Anwendungsdetails für die Protokollausgabe für Projekte und Implementierungsanalysen von Beispieldemonstrationen zu konfigurieren

Verwenden Sie Log4j, um Anwendungsdetails für die Protokollausgabe für Projekte und Implementierungsanalysen von Beispieldemonstrationen zu konfigurieren

高洛峰
高洛峰Original
2017-01-18 13:12:391243Durchsuche

Log4j-Komponentenzusammensetzung

Log4j besteht aus drei wichtigen Komponenten:

1. Priorität der Protokollinformationen (Logger)

2 )

3. Ausgabeformat (Layout) der Protokollinformationen.

Zusammenfassung:

Die Prioritäten der Protokollinformationen von hoch nach niedrig sind ERROR, WARN, INFO und DEBUG, die verwendet werden, um die Wichtigkeit dieser Protokollinformationen anzugeben

Das Ausgabeziel der Protokollinformationen gibt an, ob das Protokoll auf der Konsole oder in einer Datei gedruckt wird

und das Ausgabeformat steuert den Anzeigeinhalt der Protokollinformationen.

Einführung in Log4j

Log4j ist ein Open-Source-Projekt von Apache. Mithilfe von Log4j können wir das Ziel der Protokollinformationsübertragung an die Konsole, Dateien, GUI-Komponenten und sogar Sockets steuern. Server, NT-Ereignisaufzeichnung, UNIX-Syslog-Daemon usw.; wir können auch das Ausgabeformat jedes Protokolls steuern. Durch die Definition der Ebene jeder Protokollinformation können wir den Protokollgenerierungsprozess detaillierter steuern. log4j-- Protokoll für Java (Java-Protokoll).

Log4j-Download-Adresse: http://logging.apache.org/log4j/2.x/download.html

Log4j-Konfigurationsdatei Format von

Log4j unterstützt zwei Konfigurationsdateiformate:

1. Die Datei im Eigenschaftenformat

kann ebenfalls vollständig verwendet werden Verwenden Sie stattdessen Konfigurationsdateien, um die Log4j-Umgebung im Code zu konfigurieren. Durch die Verwendung von Konfigurationsdateien wird Ihre Anwendung jedoch flexibler.

Log4j-Definitionskonfigurationsdatei

1. Konfigurieren Sie den Root-Logger

Die Syntax lautet:

Parameterbeschreibung:
log4j.rootLogger = [ level ] , appenderName, appenderName, …

level Ist die Priorität der Protokollierung, unterteilt in OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL oder die von Ihnen definierte Ebene.

Aus: Die höchste Stufe, mit der die gesamte Protokollierung deaktiviert wird.

Schwerwiegend: Zeigt an, dass jedes schwerwiegende Fehlerereignis zum Beenden der Anwendung führt.

Fehler: Zeigt an, dass ein Fehlerereignis zwar auftritt, sich aber dennoch nicht auf den weiteren Betrieb des Systems auswirkt.

Warnung: Zeigt an, dass eine potenzielle Fehlersituation auftreten wird

Info: Wird im Allgemeinen auf grobkörniger Ebene verwendet und betont den gesamten laufenden Prozess der Anwendung

Debug: Im Allgemeinen Wird auf grobkörniger Ebene verwendet und betont den gesamten laufenden Prozess der Anwendung.

Alle: Die niedrigste Ebene, mit der die gesamte Protokollierung aktiviert wird.

Log4j empfiehlt die Verwendung von nur vier Ebenen. Die Prioritäten von hoch nach niedrig sind ERROR, WARN, INFO und DEBUG. Über die hier definierten Ebenen können Sie das Ein- und Ausschalten der entsprechenden Protokollinformationsebene in der Anwendung steuern.

appenderName bezieht sich auf den Ort, an dem die Protokollinformationen ausgegeben werden, und es können mehrere Ausgabeziele gleichzeitig angegeben werden.

2. Konfigurieren Sie den Appender für die Protokollinformationsausgabe

Die Syntax lautet:

Die von Log4j bereitgestellten Appender lauten wie folgt:
log4j.appender.appenderName = fully.qualified.name.of.appender.class  
log4j.appender.appenderName.option1 = value1  
...  
log4j.appender.appenderName.option = valueN

 org .apache.log4j.ConsoleAppender (Konsole)

org.apache.log4j.FileAppender (Datei)

org.apache.log4j.DailyRollingFileAppender (erzeugt jeden Tag eine Protokolldatei)

org.apache.log4j.RollingFileAppender (erzeugt eine neue Datei, wenn die Dateigröße die angegebene Größe erreicht)

org.apache.log4j.WriterAppender (sendet Protokollinformationen an einen beliebigen angegebenen Ort im Streaming-Format)

3. Konfigurieren Sie das Format der Protokollinformationen

Die Syntax lautet:

Die von Log4j bereitgestellten Layouts sind wie folgt:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1 …
log4j.appender.appenderName.layout.option = valueN


org.apache.log4j.HTMLLayout (Layout im HTML-Tabellenformat),

org.apache.log4j.PatternLayout (Layoutmodus kann flexibel angegeben werden),

org.apache.log4j.SimpleLayout (enthält die Ebene und Informationszeichenfolge der Protokollinformationen),

org.apache.log4j.TTCCLayout (enthält Informationen zu Protokollgenerierungszeit, Thread, Kategorie usw.)

Log4J verwendet ein Druckformat, das der printf-Funktion in der C-Sprache ähnelt, um Protokollinformationen zu formatieren. Die Druckparameter lauten wie folgt:

%m gibt die im Code angegebene Nachricht aus

%p Ausgabepriorität, nämlich DEBUG, INFO, WARN, ERROR, FATAL

%r Gibt die Anzahl der Millisekunden aus, die vom Start der Anwendung bis zur Ausgabe der Protokollinformationen benötigt werden

%c Die Kategorie, zu der die Ausgabe gehört, normalerweise die Kategorie, zu der sie gehört. Der vollständige Name

%t. Gibt den Namen des Threads aus, der das Protokollereignis generiert hat.

%n. Gibt einen Wagenrücklauf und einen Zeilenvorschub aus Zeichen, „rn“ für Windows-Plattform, „n“ für Unix-Plattform

%d gibt das Datum oder die Uhrzeit des Protokollzeitpunkts aus. Das Standardformat ist ISO8601. Sie können das Format auch nachträglich angeben : %d{yyy MMM dd HH:mm:ss,SSS}. Die Ausgabe ist ähnlich: 2002 October Month 18 22:10:28,921  

%l Gibt den Ort aus, an dem das Protokollereignis aufgetreten ist, einschließlich der Kategorie Name, der Thread, in dem es aufgetreten ist, und die Anzahl der Zeilen im Code. Beispiel: Testlog4.main(TestLog4.java:10)

%x: Gibt die NDC (verschachtelte Diagnoseumgebung) aus, die dem aktuellen Thread zugeordnet ist, insbesondere für Multi-Client- und Multi-Thread-Anwendungen wie Java Servlets Middle.

%%: Geben Sie ein „%“-Zeichen aus. %F: Geben Sie den Dateinamen aus, in dem die Protokollmeldung generiert wurde.

%L: Geben Sie die Zeilennummer im Code aus.

%m: Gibt die im Code angegebene Nachricht und die generierten spezifischen Protokollinformationen aus.

%n: Gibt einen Wagenrücklauf und einen Zeilenvorschub aus, der auf der Windows-Plattform „rn“ und auf Unix „n“ ist Der Zeilenumbruch in den Ausgabeprotokollinformationen kann zwischen % und Add-Modifiers zwischen Musterzeichen liegen, um deren minimale Breite, maximale Breite und Textausrichtung zu steuern.

如:

1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。

2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,”-”号指定左对齐。

3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。

4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。

log4j.xml的配置方式

View Code
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="appender1"
        class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="logfile08.html" />
        <param name="MaxFileSize" value="1MB" />
        <param name="MaxBackupIndex" value="5" />
        <layout class="org.apache.log4j.HTMLLayout">
        </layout>
    </appender>
    <root>
        <level value="debug" />
        <appender-ref ref="appender1" />
    </root>
</log4j:configuration>

代码中使用Log4j


  在程序中使用 Log4j之前,首先要将commons-logging.jar和logging-log4j-1.2.9.jar导入到classpath中,并将 log4j.properties放于src根目录中。 在类中使用log4j,首先声明一个静态变量 Logger logger=Logger.getLog("classname").现在就可以使用了。

用法如下:logger.debug("debug message")或者logger.info("info message").

1.得到记录器 

  使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。

其语法为:

  public static Logger getLogger( String name)

  通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:

  static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )

 

2.读取配置文件 

  当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:

  BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。

  PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。

  DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。

 

3.插入记录信息(格式化日志信息) 

  当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,语法如下:

   Logger.debug ( Object message ) ;

   Logger.info ( Object message ) ;

   Logger.warn ( Object message ) ;

   Logger.error ( Object message ) ; 

 

程序演示

1.使用程序进行日志信息输出

package org.demo.log4j.dennisit;

 import java.io.IOException;

 import org.apache.commons.logging.impl.Log4JLogger;
 import org.apache.log4j.BasicConfigurator;
 import org.apache.log4j.FileAppender;
 import org.apache.log4j.Layout;
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.log4j.SimpleLayout;

 /**
  *
  *  @version : 1.1
  *  
  *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
  *    
  *  @since      : 1.0        创建时间:    2013-1-1        下午03:19:42
  *     
  *  @function: 通过代码将日志输出
  *
  */

 public class Log4jPrintByCode {

     private static Logger logger = Logger.getLogger(Log4jPrintByCode.class);

     private Layout layout = new SimpleLayout();
     private FileAppender fileAppender;

 
     //使用构造依赖,创建对象时初始化
     public Log4jPrintByCode(Layout layout, Level level,String distDir){

         BasicConfigurator.configure();        //使用默认的配置信息,不需要写log4j.properties

         try {
             init(layout,level, distDir);
         } catch (Exception e) {
             e.printStackTrace();
         }

     }

     
     public void init(Layout layout, Level level,String distDir) throws Exception{

         logger.setLevel(level);                //设置日志输出级别
         fileAppender = new FileAppender(layout,distDir,false);
         logger.addAppender(fileAppender);    //添加输出端

     }

     
     public static void main(String[] args) {

         SimpleLayout layout = new SimpleLayout();
         String logDir = "log4jcode.Log";
         Log4jPrintByCode log4jCode = new Log4jPrintByCode(layout,Level.INFO,logDir);

         
         //下面信息将被输出
         log4jCode.logger.info("log info print by log4j");
         log4jCode.logger.warn("log warn print by log4j");
         log4jCode.logger.error("log error print by log4j");

     }

 
     public Layout getLayout() {
         return layout;
     }

     public void setLayout(Layout layout) {
         this.layout = layout;
     }

     public FileAppender getFileAppender() {
         return fileAppender;
     }

     public void setFileAppender(FileAppender fileAppender) {
         this.fileAppender = fileAppender;
     }

     

 }

为了提高效率,我们可以在写日志前增加判断:

// 记录debug级别的信息
if (logger.isDebugEnabled()) {
    logger.debug("This is debug message from Dao.");
}
// 记录info级别的信息
if (logger.isInfoEnabled()) {
    logger.info("This is info message from Dao.");
}

如果这个类作为基类,如J2EE中的BaseDao、BaseAction、BaseService等等,则我们可以将各层的日志信息分类输出到各个文件。

2.Log4J将同一个日志信息输出到多个目的地

/* 创建数据库 */ 
create database db_log4j;
/* 切换数据库 */
use  db_log4j;
/* 日志信息表 */
create table tb_log(
    logId int not null auto_increment comment &#39;流水号&#39; ,
    createDate varchar(45) default null comment &#39;日志生成时间&#39; ,
    thread varchar(45) default null comment &#39;当前线程&#39;,
    level varchar(45) default null comment &#39;当前日志级别&#39; ,
    class varchar(45) default null comment &#39;生成日志的类&#39;,
    message varchar(245) default null comment &#39;日志具体信息&#39;,
    primary key(logId)
);

应用实例将日志信息同时输出到控制台,文件和数据库中.

创建数据库与 表

/* 创建数据库 */ 
create database db_log4j;
/* 切换数据库 */
use  db_log4j;
/* 日志信息表 */
create table tb_log(
    logId int not null auto_increment comment &#39;流水号&#39; ,
    createDate varchar(45) default null comment &#39;日志生成时间&#39; ,
    thread varchar(45) default null comment &#39;当前线程&#39;,
    level varchar(45) default null comment &#39;当前日志级别&#39; ,
    class varchar(45) default null comment &#39;生成日志的类&#39;,
    message varchar(245) default null comment &#39;日志具体信息&#39;,
    primary key(logId)
);

配置文件log4j.properties

#定义3个输出端
log4j.rootCategory=INFO,A1,A2,A3
#定义A1输出到控制器
log4j.appender.A1=org.apache.log4j.ConsoleAppender
#定义A1的布局模式为PaternLayout
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# 定义A1的输出格式
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n
#定义A2输出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
#定义A2输出到哪个文件
log4j.appender.A2.File=./log/sysLog.log
#定义A2输出文件的最大长度
log4j.appender.A2.MaxFileSize = 1KB
#定义A2的备份文件数
log4j.appender.A2.MaxBackupIndex = 3
#定义A2的布局模式为PatternLayout
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
#定义A2的输出模式
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n
#定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定义A3的布局和执行的SQL语句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values(&#39;%d&#39;,&#39;%t&#39;,&#39;%-5p&#39;,&#39;%c&#39;,&#39;%m&#39;)

Java测试代码

package org.demo.log4j.dennisit;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
/**
 *
 *  @version : 1.1
 *  
 *  @author  : 苏若年    <a href="mailto:DennisIT@163.com">发送邮件</a>
 *    
 *  @since      : 1.0        创建时间:    2013-1-1        下午04:13:59
 *     
 *  @function: 通过配置文件控制日志信息输出到多个目的端
 *
 */
public class Log4jPrintByConfigure {

    private static Logger logger = Logger.getLogger(Log4jPrintByConfigure.class);

    public static void main(String[] args) throws Exception {
        //加载log配置文件log4j.properties
        PropertyConfigurator.configure("configure/log4j.properties");//文件存放在src同目录的configure文件夹下

        //如果放在src下的话,参数应为"bin/log4j.properties"或者"src/log4j.properties", 建议以bin为准

        //以下信息将被打印输出
        logger.debug("logger print DEBUG messgae");
        logger.info("logger print INFO message");
        logger.warn("logger print WARN message");
        logger.error("logger print ERROR message");
        logger.fatal("Here is FATAL message");
    }
}

更多使用Log4j为项目配置日志输出应用详解以及示例演示的实现分析相关文章请关注PHP中文网!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn