Bagaimana cara menginisialisasi log4j dengan benar?

280

Setelah menambahkan log4j ke aplikasi saya, saya mendapatkan output berikut setiap kali saya menjalankan aplikasi saya:

log4j: PERINGATAN Tidak ada appenders yang dapat ditemukan untuk logger (slideselector.facedata.FaceDataParser).
log4j: PERINGATAN Silakan inisialisasi sistem log4j dengan benar.

Tampaknya ini berarti file konfigurasi tidak ada. Di mana file konfigurasi ini berada dan apakah konten awal yang baik?

Saya menggunakan java biasa untuk mengembangkan aplikasi desktop. Jadi tidak ada server web dll ...

Janusz
sumber
49
untuk semua pakar seperti saya: masukkan log4j.properties ke src / main / resources !!
Karussell
Dokumentasi log4j memiliki sampel yang sangat mendasar dari file log4j.xml .
Ken Bloom
Sangat bermanfaat untuk membaca manual pendek Log4j: logging.apache.org/log4j/1.2/manual.html
Sa'ad

Jawaban:

278

Log4jsecara default mencari file yang dipanggil log4j.propertiesatau log4j.xmldi classpath.

Anda dapat mengontrol file mana yang digunakan untuk menginisialisasi sendiri dengan mengatur properti sistem seperti yang dijelaskan di sini (Cari bagian "Prosedur Inisialisasi Default").

Sebagai contoh:

java -Dlog4j.configuration=customName ....

Akan menyebabkan log4jmencari file bernama customName di classpath.

Jika Anda mengalami masalah, saya merasa sangat membantu untuk mengaktifkan log4j.debug:

-Dlog4j.debug

Ini akan mencetak ke System.out banyak informasi bermanfaat tentang file mana yang digunakan untuk menginisialisasi sendiri, mana penebang / appenders yang dikonfigurasi dan bagaimana dll.

File konfigurasi dapat berupa file properti java atau file xml. Berikut adalah contoh format file properti yang diambil dari halaman dokumentasi intro log4j :

log4j.rootLogger=debug, stdout, R

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log

log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
beruang kutub
sumber
43
Jadi untuk memuat file configuartion dari file yang tidak ada di classpath Anda harus melakukannya seperti: -Dlog4j.configuration = file: / c: /my/folder/log4j.properties yang sebenarnya merupakan URL.
bbcooper
15
satu tip kecil yang mungkin berguna bagi seseorang: Anda juga dapat mengaktifkan debugger log4j dengan mengaktifkan properti terkait dalam kode - System.setProperty ("log4j.debug", ""));
XXL
Di mana Anda meletakkan java -Dlog4j.configuration=customName? Saya mencoba Pengaturan Proyek / Preferensi / Run / Debug, mengambil beberapa konfigurasi, mengklik Edit, tab Argumen, argumen VM. Apakah customName menyertakan ekstensi .xml?
Noumenon
2
Setelah mencoba banyak variasi, ini berhasil: -Dlog4j.configuration = file: /// C: /mydir/subdir/log4j.properties Contoh di atas: -Dlog4j.configuration = file: / c: /my/folder/log4j.properties gagal.
user1062589
1
Saya sangat berharap manual akan lebih menekankan yang -Dlog4j.debugdapat membantu men-debug konfigurasi Anda.
Sridhar Sarnobat
239

Ketika mengatur log4j dengan baik sangat bagus untuk proyek "nyata" Anda mungkin menginginkan solusi cepat dan kotor, misalnya jika Anda hanya menguji perpustakaan baru.

Jika demikian panggilan ke metode statis

org.apache.log4j.BasicConfigurator.configure();

akan mengatur logging dasar ke konsol, dan pesan kesalahan akan hilang.

Peter Lind
sumber
Hai a3. 14_Infinity di mana saya harus menggunakan ini? saya tidak bisa mengerti. bahkan saya telah merujuk lebih banyak jawaban untuk masalah ini. tolong bantu saya
Ravi Potnuru
5
Perlu diingat bahwa ini akan default ke logging tingkat Debug, yang mungkin tidak diinginkan. Anda dapat mengubah ini seperti ini:Logger.getRootLogger().setLevel(Level.INFO);
forresthopkinsa
Bukan hanya peringatannya hilang, tapi saya mendapatkan beberapa info keluaran debug berguna di jendela konsol
Baked Inhalf
2
sangat ironis..kami menggunakannya pada status produksi
aswzen
25

Jika Anda menyingkirkan semuanya (misalnya jika Anda sedang dalam tes)

org.apache.log4j.BasicConfigurator.configure(new NullAppender());
pengguna831217
sumber
20

Sesuai halaman FAQ Apache Log4j :

Mengapa saya melihat peringatan tentang "Tidak ada appenders ditemukan untuk logger" dan "Silakan konfigurasikan log4j dengan benar"?

Ini terjadi ketika filelog4j.propertieslog4j.xml konfigurasi default dan tidak dapat ditemukan dan aplikasi tidak melakukan konfigurasi eksplisit. log4jdigunakan Thread.getContextClassLoader().getResource()untuk mencari file konfigurasi default dan tidak secara langsung memeriksa sistem file. Mengetahui lokasi yang tepat untuk menempatkan log4j.properties atau log4j.xmlmembutuhkan pemahaman strategi pencarian loader kelas yang digunakan. log4jtidak menyediakan konfigurasi default karena output ke konsol atau ke sistem file mungkin dilarang di beberapa lingkungan.

Pada dasarnya peringatan Tidak ada appenders dapat ditemukan untuk logger berarti Anda menggunakan log4jsistem logging, tetapi Anda belum menambahkan Appenders (seperti FileAppender, ConsoleAppender, SocketAppender, SyslogAppender, dll.) Ke dalam file konfigurasi Anda atau file konfigurasi adalah hilang.

Ada tiga cara untuk mengkonfigurasi log4j: dengan file properti ( log4j.properties), dengan file XML dan melalui kode Java ( rootLogger.addAppender(new NullAppender());).

log4j.properties

Jika Anda telah menyajikan file properti (mis. Ketika menginstal Solr), Anda perlu menempatkan file ini dalam direktori classpath Anda .

jalan setapak kelas

Berikut adalah beberapa saran perintah di Linux cara menentukan nilai classpath Anda:

$ echo $CLASSPATH
$ ps wuax | grep -i classpath
$ grep -Ri classpath /etc/tomcat? /var/lib/tomcat?/conf /usr/share/tomcat?

atau dari Jawa: System.getProperty("java.class.path").

Log4j XML

Di bawah ini adalah file konfigurasi XML dasar untuk log4j dalam format XML:

<?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{1} - %m%n"/> 
    </layout> 
  </appender> 

  <root> 
    <priority value ="debug" /> 
    <appender-ref ref="console" /> 
  </root>
  
</log4j:configuration>

Kucing jantan

Jika Anda menggunakan Tomcat, Anda dapat menempatkan log4j.propertieske: /usr/share/tomcat?/lib/atau /var/lib/tomcat?/webapps/*/WEB-INF/lib/folder.

Solr

Untuk referensi, log4j.propertiesfile default Solr terlihat seperti:

#  Logging level
solr.log=logs/
log4j.rootLogger=INFO, file, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-4r [%t] %-5p %c %x \u2013 %m%n

#- size rotation with log cleanup.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.MaxFileSize=4MB
log4j.appender.file.MaxBackupIndex=9

#- File to log to and log format
log4j.appender.file.File=${solr.log}/solr.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS}; %C; %m\n

log4j.logger.org.apache.zookeeper=WARN
log4j.logger.org.apache.hadoop=WARN

# set to INFO to enable infostream log messages
log4j.logger.org.apache.solr.update.LoggingInfoStream=OFF

Mengapa log4j tidak dapat menemukan file properti saya di aplikasi J2EE atau WAR?

Jawaban singkat: kelas log4j dan file properti tidak dalam lingkup classloader yang sama.

Log4j hanya menggunakan Class.forName()mekanisme default untuk memuat kelas. Sumber daya ditangani dengan cara yang sama. Lihat dokumentasi java.lang.ClassLoaderuntuk lebih jelasnya.

Jadi, jika Anda mengalami masalah, coba muat kelas atau sumber daya sendiri. Jika Anda tidak dapat menemukannya, log4j juga tidak. ;)


Lihat juga:

kenorb
sumber
12

Anda dapat mengatur lokasi log4j.properties Anda dari dalam aplikasi java Anda dengan menggunakan:

org.apache.log4j.PropertyConfigurator.configure(file/location/log4j.properties)

Informasi lebih lanjut tersedia di sini: https://logging.apache.org/log4j/1.2/manual.html

Arash
sumber
1
Hmmm, kelas tidak ditemukan. Sebuah importpernyataan selalu membantu sebagai kode selesai tidak semua yang dapat diandalkan.
Martin
11

Temukan log4j.properties atau log4j.xml online yang memiliki append root, dan letakkan di classpath Anda.

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout

akan masuk ke konsol. Saya lebih suka masuk ke file sehingga Anda dapat menyelidiki setelahnya.

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file

walaupun untuk aplikasi logging verbose 100KB biasanya perlu ditingkatkan menjadi 1MB atau 10MB, terutama untuk debug.

Secara pribadi saya mengatur beberapa logger, dan mengatur root logger untuk memperingatkan atau tingkat kesalahan daripada men-debug.

Astaga
sumber
9

Cara lain untuk melakukannya tanpa meletakkan file properti di classpath, adalah dengan mengatur properti dari kode java secara langsung. Ini kode contohnya.

public class Log4JSample {

public static void main(String[] args) {
    Properties properties=new Properties();
    properties.setProperty("log4j.rootLogger","TRACE,stdout,MyFile");
    properties.setProperty("log4j.rootCategory","TRACE");

    properties.setProperty("log4j.appender.stdout",     "org.apache.log4j.ConsoleAppender");
    properties.setProperty("log4j.appender.stdout.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.stdout.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    properties.setProperty("log4j.appender.MyFile", "org.apache.log4j.RollingFileAppender");
    properties.setProperty("log4j.appender.MyFile.File", "my_example.log");
    properties.setProperty("log4j.appender.MyFile.MaxFileSize", "100KB");
    properties.setProperty("log4j.appender.MyFile.MaxBackupIndex", "1");
    properties.setProperty("log4j.appender.MyFile.layout",  "org.apache.log4j.PatternLayout");
    properties.setProperty("log4j.appender.MyFile.layout.ConversionPattern","%d{yyyy/MM/dd HH:mm:ss.SSS} [%5p] %t (%F) - %m%n");

    PropertyConfigurator.configure(properties);

    Logger logger = Logger.getLogger("MyFile");

    logger.fatal("This is a FATAL message.");
    logger.error("This is an ERROR message.");
    logger.warn("This is a WARN message.");
    logger.info("This is an INFO message.");
    logger.debug("This is a DEBUG message.");
    logger.trace("This is a TRACE message.");
}

}

batu333
sumber
6

Anda dapat mengatur level log dengan menggunakan setLevel () .

Tingkat berguna untuk dengan mudah mengatur jenis informasi yang Anda inginkan untuk ditampilkan oleh program.

Sebagai contoh:

Logger.getRootLogger().setLevel(Level.WARN); //will not show debug messages

Set level yang memungkinkan adalah:

JEJAK,

DEBUG,

INFO,

MEMPERINGATKAN,

GALAT dan

FATAL

Menurut manual Layanan Logging

Matematika
sumber
6
import org.apache.log4j.BasicConfigurator;

Panggil metode ini

BasicConfigurator.configure();
Winson So
sumber
Secara khusus, ini menulis untuk System.out. Javadoc untuk metode configure no-args mengatakan:Add a ConsoleAppender that uses PatternLayout using the PatternLayout#TTCC_CONVERSION_PATTERN and prints to System.out to the root category.
sunil
3

Untuk mengaktifkan -Dlog4j.debug, saya pergi ke Sistem, Pengaturan sistem lanjutan, variabel Lingkungan dan mengatur variabel sistem _JAVA_OPTIONSke -Dlog4j.debug.

Feng Zhang
sumber
1

Apa yang sedang Anda kembangkan? Apakah Anda menggunakan Apache Tomcat?

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyyMMdd HH:mm:ss.SSS} [[%5p] %c{1} [%t]] %m%n

Saya memiliki properti seperti ini di aplikasi Java saya.

Steven
sumber
1

Log4j saya diperbaiki dengan file properti di bawah ini:

## direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.rootLogger=debug, stdout
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=100KB
log4j.appender.file.maxBackupIndex=5
log4j.appender.file.File=./logs/test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
log4j.rootLogger=debug,file
Kanishk
sumber
Hai, bagaimana saya bisa menambahkan konfigurasi untuk debug ke konsol dan kesalahan ke file?
JhonArias
1

Saya telah membuat file log4j.properties di folder resources di sebelah file hibernate.cfg.xml dan mengisinya dengan teks di bawah ini:

log4j.rootLogger=INFO, CONSOLE

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n

sekarang saya menyingkirkan peringatan dan kesalahan

Aybek Kokanbekov
sumber
1

Cukup, buat properti log4j.prop di bawah folder src / main / assembly. Bergantung pada apakah Anda ingin pesan log ditampilkan di konsol atau dalam file yang Anda modifikasi file Anda. Berikut ini akan menunjukkan pesan Anda di konsol.

# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
NSonmez
sumber
1

Seperti yang dijelaskan sebelumnya ada 2 pendekatan

Yang pertama adalah menambahkan baris ini ke metode utama Anda:

BasicConfigurator.configure();

Pendekatan kedua adalah menambahkan file log4j.properties standar ini ke classpath Anda:

Saat mengambil pendekatan kedua Anda perlu memastikan Anda menginisialisasi file dengan benar.

Misalnya.

Properties props = new Properties();

props.load(new FileInputStream("log4j property file path"));

props.setProperty("log4j.appender.File.File", "Folder where you want to store log files/" + "File Name");

Pastikan Anda membuat folder yang diperlukan untuk menyimpan file log.

AkashK
sumber
1

Coba atur atribut debug di log4j: node konfigurasi ke true.

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="true">

Ini mencetak informasi ketika file konfigurasi dibaca dan digunakan untuk mengkonfigurasi lingkungan log4j. Anda mungkin mendapatkan lebih banyak detail untuk menyelesaikan masalah Anda.

atom88
sumber
Apakah ada yang tahu? Apakah opsi yang sama juga dapat digunakan dari konfigurasi properti tanpa kembali ke pengaturan -Dlog4j.debug = true pada saat runtime startup?
JFK
1

Logging API - Java Logging API memfasilitasi servis dan pemeliharaan perangkat lunak di lokasi pelanggan dengan membuat laporan log yang sesuai untuk analisis oleh pengguna akhir, administrator sistem, insinyur layanan lapangan, dan tim pengembangan perangkat lunak. Logging API menangkap informasi seperti kegagalan keamanan, kesalahan konfigurasi, hambatan kinerja, dan / atau bug dalam aplikasi atau platform. Paket inti mencakup dukungan untuk mengirimkan catatan log berformat teks atau XML sederhana ke memori, aliran output, konsol, file, dan soket. Selain itu, API pencatatan mampu berinteraksi dengan layanan pencatatan yang sudah ada pada sistem operasi host.

Package java.util.logging «Menyediakan kelas dan antarmuka dari fasilitas logging inti platform Java.


Log4j 1.x «log4j adalah utilitas logging berbasis Java yang populer. Log4j adalah proyek open source berdasarkan karya banyak penulis. Ini memungkinkan pengembang untuk mengontrol pernyataan log mana yang di-output ke berbagai lokasi dengan menggunakan Appenders [konsol, file, DB dan email]. Ini sepenuhnya dapat dikonfigurasi saat runtime menggunakan file konfigurasi eksternal.

Log4j memiliki tiga komponen utama:

  • Loggers - [OFF, FATAL, ERROR, PERINGATAN, INFO, DEBUG, TRACE]
  • Banding

  • Layouts - [PatternLayout, EnhancedPatternLayout]

File konfigurasi dapat ditulis dalam format XML atau dalam properti Java (key = value).

  1. log4j_External.properties «Format properti Java (key = value)

String antara pembukaan " $ { " dan penutupan " } " ditafsirkan sebagai kunci. Nilai variabel tersubstitusi dapat didefinisikan sebagai properti sistem atau dalam file konfigurasi itu sendiri. Tetapkan opsi spesifik appender. «Log4j.appender.appenderName.option = nilai, Untuk setiap appender yang disebutkan, Anda dapat mengonfigurasi Tata Letaknya.

log4j.rootLogger=INFO, FILE, FILE_PER_SIZE, FILE_PER_DAY, CONSOLE, MySql

#log.path=./
log.path=E:/Logs

# https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
# {%-5p - [WARN ,INFO ,ERROR], %5p 0- [ WARN, INFO,ERROR]}
log.patternLayout=org.apache.log4j.PatternLayout
log.pattern=%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n

# System.out | System.err
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Target=System.err
log4j.appender.CONSOLE.layout=${log.patternLayout}
log4j.appender.CONSOLE.layout.ConversionPattern=${log.pattern}

# File Appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log.path}/logFile.log
#log4j:ERROR setFile(null,false) call failed. - Defaults setFile(null,true)
#log4j.appender.FILE.Append = false
log4j.appender.FILE.layout=${log.patternLayout}
log4j.appender.FILE.layout.ConversionPattern=${log.pattern}

# BackUP files for every Day.
log4j.appender.FILE_PER_DAY=org.apache.log4j.DailyRollingFileAppender
# [[ Current File ] - logRollingDayFile.log ], { [BackUPs] logRollingDayFile.log_2017-12-10, ... }
log4j.appender.FILE_PER_DAY.File=${log.path}/logRollingDayFile.log
log4j.appender.FILE_PER_DAY.DatePattern='_'yyyy-MM-dd
log4j.appender.FILE_PER_DAY.layout=${log.patternLayout}
log4j.appender.FILE_PER_DAY.layout.ConversionPattern=${log.pattern}

# BackUP files for size rotation with log cleanup.
log4j.appender.FILE_PER_SIZE=org.apache.log4j.RollingFileAppender
# [[ Current File ] - logRollingFile.log ], { [BackUPs] logRollingFile.log.1, logRollingFile.log.2}
log4j.appender.FILE_PER_SIZE.File=${log.path}/logRollingFile.log
log4j.appender.FILE_PER_SIZE.MaxFileSize=100KB
log4j.appender.FILE_PER_SIZE.MaxBackupIndex=2
log4j.appender.FILE_PER_SIZE.layout=${log.patternLayout}
log4j.appender.FILE_PER_SIZE.layout.ConversionPattern=${log.pattern}

# MySql Database - JDBCAppender
log4j.appender.MySql=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.MySql.driver=com.mysql.jdbc.Driver
log4j.appender.MySql.URL=jdbc:mysql://localhost:3306/automationlab
log4j.appender.MySql.user=root
log4j.appender.MySql.password=
log4j.appender.MySql.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.MySql.layout.ConversionPattern=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');
#log4j.appender.MySql.sql=INSERT INTO `logdata` VALUES ('%p', '%d{yyyy-MM-dd HH:mm:ss}', '%C', '%M', '%L', '%m');

# Direct log events[Messages] to MongoDB Collection - MongoDbAppender
log.mongoDB.hostname=loalhost
log.mongoDB.userName=Yash777
log.mongoDB.password=Yash@123
log.mongoDB.DB=MyLogDB
log.mongoDB.Collection=Logs

log4j.appender.MongoDB=org.log4mongo.MongoDbAppender
log4j.appender.MongoDB.hostname=${log.mongoDB.hostname}
log4j.appender.MongoDB.userName=${log.mongoDB.userName}
log4j.appender.MongoDB.password=${log.mongoDB.password}
log4j.appender.MongoDB.port=27017
log4j.appender.MongoDB.databaseName=${log.mongoDB.DB}
log4j.appender.MongoDB.collectionName=${log.mongoDB.Collection}
log4j.appender.MongoDB.writeConcern=FSYNCED

Struktur Tabel MySQL untuk tabel logdata

CREATE TABLE IF NOT EXISTS `logdata` (
  `Logger_Level` varchar(5) COLLATE utf8_unicode_ci NOT NULL,
  `DataTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ClassName` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
  `MethodName` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `LineNumber` int(10) NOT NULL,
  `Message` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
  1. log4j_External.xml «XML log4j: konfigurasi dengan file DTD publik
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE log4j:configuration PUBLIC
  "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration debug="false">

    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <param name="target" value="System.out" />
        <param name="threshold" value="debug" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE" class="org.apache.log4j.FileAppender">
        <param name="file" value="E:/Logs/logFile.log" />
        <param name="append" value="false" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE_PER_SIZE" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="E:/Logs/logRollingFile.log" />
        <param name="immediateFlush" value="true"/>
        <param name="maxFileSize" value="100KB" />
        <param name="maxBackupIndex" value="2"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" />
        </layout>
    </appender>

    <appender name="FILE_PER_DAY" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="E:/Logs/logRollingDayFile.log" />
        <param name="datePattern" value="'_'yyyy-MM-dd" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n"/>
        </layout>
    </appender>

    <root>
        <priority value="info" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="FILE_PER_SIZE" />
        <appender-ref ref="FILE_PER_DAY" />
    </root>
</log4j:configuration>

  1. Konfigurasi Log4j dari URL di program Java:

Untuk menentukan konfigurasi khusus dengan file eksternal, kelas yang digunakan harus mengimplementasikan antarmuka Configurator .

ketika file konfigurasi default "log4j.properties", "log4j.xml" tidak tersedia

public class LogFiles {
    // Define a static logger variable so that it references the Logger instance named "LogFiles".
    static final Logger log = Logger.getLogger( LogFiles.class );

    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
        System.out.println("CONFIGURATION_FILE « "+LogManager.DEFAULT_CONFIGURATION_FILE);
        System.out.println("DEFAULT_XML_CONFIGURATION_FILE = 'log4j.xml' « Default access modifier");

        String fileName = //"";
                //"log4j_External.xml";
                "log4j_External.properties";
        String configurationFile = System.getProperty("user.dir")+"/src/" + fileName;

        if( fileName.contains(".xml") ) {
            DOMConfigurator.configure( configurationFile );
            log.info("Extension *.xml");
        } else if ( fileName.contains(".properties") ) {
            PropertyConfigurator.configure( configurationFile );
            log.info("Extension *.properties");
        } else {
            DailyRollingFileAppender dailyRollingAppender = new DailyRollingFileAppender();
            dailyRollingAppender.setFile("E:/Logs/logRollingDayFile.log");
            dailyRollingAppender.setDatePattern("'_'yyyy-MM-dd");

            PatternLayout layout = new PatternLayout();
            layout.setConversionPattern( "%-5p - %d{yyyy-MM-dd HH:mm:ss.SSS} %C{1}:%12.20M:%L - %m %n" );
            dailyRollingAppender.setLayout(layout);

            dailyRollingAppender.activateOptions();

            Logger rootLogger = Logger.getRootLogger();
            rootLogger.setLevel(Level.DEBUG);
            rootLogger.addAppender(dailyRollingAppender);

            log.info("Configuring from Java Class.");
        }

        log.info("Console.Message.");
        method2();
        methodException(0);
    }

    static void method2() {
        log.info("method2 - Console.Message.");
    }
    static void methodException(int b) {
        try {
            int a = 10/b;
            System.out.println("Result : "+ a);
            log.info("Result : "+ a);
        } catch (Exception ex) { // ArithmeticException: / by zero
            log.error(String.format("\n\tException occurred: %s", stackTraceToString(ex)));
        }
    }
    public static String stackTraceToString(Exception ex) {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        ex.printStackTrace(pw);
        return sw.toString();
    }
}
Yash
sumber
1

Perbaikan bagi saya adalah memasukkan "log4j.properties" ke dalam folder "src".

Perak
sumber
0

Jika kita menggunakan apache commons logging wrapper di atas log4j, maka kita perlu memiliki kedua guci yang tersedia di classpath. Juga, commons-logging.propertiesdan log4j.properties/xmlharus tersedia di classpath.

Kami juga dapat melewati kelas implementasi dan log4j.propertiesnama sebagai JAVA_OPTSmenggunakan -Dorg.apache.commons.logging.Log=<logging implementation class name> -Dlog4j.configuration=<file:location of log4j.properties/xml file>. Hal yang sama dapat dilakukan melalui pengaturan JAVA_OPTSjika server aplikasi / web.

Ini akan membantu mengeksternalisasi properti yang dapat diubah dalam penerapan.

Pisau
sumber
0

Ini adalah cara alternatif menggunakan .yaml

Struktur logika:

Configuration:
    Properties:
    Appenders:
    Loggers:

Sampel:

Configutation:
    name: Default

    Properties:
        Property:
            name: log-path
            value: "logs"

    Appenders:

        Console:
        name: Console_Appender
        target: SYSTEM_OUT
        PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

       File:
          name: File_Appender
          fileName: ${log-path}/logfile.log
          PatternLayout:
            pattern: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

    Loggers:

        Root:
            level: debug
            AppenderRef:
              - ref: Console_Appender

        Logger:
            - name: <package>.<subpackage>.<subsubpackage>.<...>
              level: debug
              AppenderRef:
                 - ref: File_Appender
                 level: error             

Ref: LOG4J 2 KONFIGURASI: MENGGUNAKAN YAML

emecas
sumber
0

Untuk pengujian, cara cepat-kotor termasuk pengaturan level log:

org.apache.log4j.BasicConfigurator.configure();
org.apache.log4j.Logger.getRootLogger().setLevel(org.apache.log4j.Level.WARN);

// set to Level.DEBUG for full, or Level.OFF..
Inhalf panggang
sumber
0

Solusi Maven:

Saya menemukan semua masalah yang sama seperti di atas, dan untuk solusi pakar saya menggunakan 2 dependensi. Konfigurasi ini hanya dimaksudkan untuk pengujian cepat jika Anda ingin proyek sederhana menggunakan logger, dengan konfigurasi standar. Saya bisa membayangkan Anda ingin membuat file konfigurasi nanti jika Anda memerlukan informasi lebih lanjut dan atau menyetel level logging Anda sendiri.

    <properties>
        <slf4jVersion>1.7.28</slf4jVersion>
    </properties>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4jVersion}</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-jdk14</artifactId>
            <version>${slf4jVersion}</version>
        </dependency>
Jasper Lankhorst
sumber
0

Saya hanya melakukan ini dan masalah telah diperbaiki.

Ikuti blog di bawah ini

https://intellij-support.jetbrains.com/hc/en-us/community/posts/206875685-How-to-fix-log4j-WARN-console-messages-when-running-an-Application-inside-IntelliJ- Ide

Tapi di sini katanya seperti di bawah ini

Untuk memperbaikinya cukup masukkan file log4j.resources berikut ke folder utama / sumber daya proyek Anda

alih-alih membuat log4j.resources, buat log4j.properties. Klik kanan pada Resource di IntelliJ -> New -> Resource Bundle - Sebut saja sebagai log4j

pengguna1753356
sumber
0

Jika Anda mengalami kesalahan ini pada Intellij IDEA bahkan setelah menambahkan log4j.propertieslog4j.xml file atau pada folder tes sumber daya Anda, mungkin Intellij IDEA belum mengetahui tentang keberadaan file.

Jadi, setelah menambahkan file, klik kanan pada file tersebut dan pilih Recompile log4j.xml .

Dherik
sumber