Di mana saya harus meletakkan file log4j.properties?

135

Saya menulis proyek layanan web menggunakan netbeans 6.7.1 dengan glassfish v2.1, menempatkan log4j.properties ke direktori root proyek dan menggunakan:

static Logger logger = Logger.getLogger(MyClass.class);

dalam konstruktor:

PropertyConfigurator.configure("log4j.properties");

dan dalam fungsi:

logger.info("...");
logger.error("...");
// ...

tetapi, ini adalah info kesalahan (sebenarnya, saya telah mencoba memasukkannya ke hampir setiap direktori yang dapat saya sadari):

log4j:ERROR Could not read configuration file [log4j.properties].
java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(FileInputStream.java:106)
        at java.io.FileInputStream.<init>(FileInputStream.java:66)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:297)
        at org.apache.log4j.PropertyConfigurator.configure(PropertyConfigurator.java:315)
        at com.corp.ors.demo.OrsDemo.main(OrisDemo.java:228)
log4j:ERROR Ignoring configuration file [log4j.properties].
log4j:WARN No appenders could be found for logger (com.corp.ors.demo.OrsDemo).
log4j:WARN Please initialize the log4j system properly.

contoh proyek dapat diperoleh dari http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8

mono
sumber
2
Apa tujuan dari PropertyConfigurator.configure ("log4j.properties"); baris? Saya tidak pernah menggunakan yang ini. File log4j.xml Anda hanya boleh "di suatu tempat" di classpath Anda.
Antoine Claval
1
Lihatlah stackoverflow.com/questions/1140358/… untuk menemukan, bagaimana konfigurasi log4j itu sendiri sedang dicatat. Saya pikir ini akan membantu Anda banyak, karena beberapa wadah memiliki konfigurasi log4j sendiri.
dz.
@AntoineClaval Saya menghapus garis terkutuk itu dan itu bekerja seperti pesona. ***, wah, wah ..
Siddharth

Jawaban:

113

Saya tahu ini agak terlambat untuk menjawab pertanyaan ini, dan mungkin Anda sudah menemukan solusinya, tetapi saya memposting solusi yang saya temukan (setelah saya banyak melakukan pencarian di Google) sehingga mungkin sedikit membantu:

  1. Letakkan log4j.properties di bawah WEB-INF \ kelas proyek seperti yang disebutkan sebelumnya di utas ini.
  2. Letakkan log4j-xx.jar di bawah WEB-INF \ lib
  3. Uji apakah log4j dimuat: tambahkan -Dlog4j.debug@ the akhir opsi java tomcat Anda

Semoga ini bisa membantu.

rgds

Rindu
sumber
Gunakan perintah 'jalankan' untuk mendapatkan kucing jantan di latar depan; Anda dapat meneruskan opsi java melalui baris perintah. Juga, opsi -x untuk bash berguna untuk melihat apa yang sebenarnya terjadi pada opsi Anda: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh run
RoyM
50

Seperti yang telah dinyatakan, log4j.properties harus berada dalam direktori yang termasuk dalam classpath, saya ingin menambahkan bahwa dalam proyek yang diolah, tempat yang bagus dapat src/main/resources/log4j.properties

stivlo
sumber
26

Anda dapat menentukan lokasi file config dengan argumen VM -Dlog4j.configuration = "file: / C: /workspace3/local/log4j.properties"

Makatun
sumber
apakah itu file: / atau file: /// atau hanya / path / ke / file pada sistem unix?
morpheus
Untuk windows hanya file: /, saya kira unix adalah sama
Amalgovinus
Ini adalah satu-satunya jawaban yang memperhitungkan beberapa lingkungan yang memiliki level log berbeda.
Matt
Di macOS, di jvm.Opsi Liberty Server tidak menggunakan tanda kutip dan menggunakan file: ///
wnm3
Hanya pembaruan yang dapat membantu menghemat frustrasi: jika Anda menggunakan log4j2, nama argumen telah diubah menjadilog4j.configurationFile
dan.m adalah user2321368
25

Anda harus meletakkannya di direktori root, yang sesuai dengan konteks eksekusi Anda.

Contoh:

    MyProject
       src
           MyClass.java
           log4j.properties

Jika Anda mulai menjalankan dari proyek yang berbeda, Anda harus memiliki file itu di proyek yang digunakan untuk memulai pelaksanaan. Sebagai contoh, jika proyek yang berbeda memegang beberapa tes JUnit, itu perlu juga memiliki file log4j.properties.


Saya sarankan menggunakan log4j.xml daripada log4j.properties. Anda memiliki lebih banyak opsi, dapatkan bantuan dari IDE Anda dan seterusnya ...

KLE
sumber
misalnya, saya hampir meletakkannya di setiap direktori. tetapi tidak membantu proyek penyebaran Glassfish, karena GF tidak menyalin properti ke direktori yang benar. Sepertinya GF kehilangan itu.
mono
sebenarnya, saya pikir masalahnya adalah dari auto-deploy dari netbeans. Saya mencoba untuk menyebarkan melalui file perang di konsol admin, tidak apa-apa. Saya tidak tahu apakah saya benar. Jika saya benar, mengapa netbeans tidak menyebarkan file-file ini ketika auto-deploy proyek.
mono
itu berhasil! tapi bukankah itu salah ... ia pikir lebih baik ditempatkan di folder "resource".
Adams.H
17

Untuk Proyek Berbasis Maven, simpan log4j.properties Anda di src / main / resources. Tidak ada yang bisa dilakukan!

Byorn
sumber
Itu saja, dan itu sama untuk file properti lainnya seperti konfigurasi XMLC di Maven Projects. Terima kasih!
Ramon
13

Jika Anda memasukkan log4j.properties di dalam src, Anda tidak perlu menggunakan pernyataan -

PropertyConfigurator.configure("log4j.properties");

Ini akan diambil secara otomatis karena file properti ada di classpath.

Ani
sumber
10

Mencoba:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));
Jhon M
sumber
9

File tersebut harus berada di direktori WEB-INF / classes. Struktur direktori ini harus dikemas dalam file perang.

Martin OConnor
sumber
dalam teori, itu adalah jawabannya, tetapi masalahnya adalah log4j.properties hilang ketika glassfish mengerahkan file perang.
mono
3
Itu harus dalam WEB-INF / kelas dan dikemas dalam file perang
Martin OConnor
@ono - setidaknya dalam arsip yang dapat diunduh tidak ada log4j.properties di web / WEB-INF / kelas. Martin benar, di situlah seharusnya.
fvu
Caranya adalah, Anda memasukkannya ke dalam folder src Anda, (Folder sumber root Anda), dalam proses membangun kode Anda, file ditransfer ke folder kelas secara otomatis ...
Mostafa Zeinali
7

IDE saya adalah NetBeans. Saya menaruh file log4j.property seperti yang ditunjukkan pada gambar

Akar

folder root proyek

Web

folder web

WEB-INF

Folder WEB-INF

Untuk menggunakan file properti ini, Anda harus menulis kode ini:

package example;

import java.io.File;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.Logger;
import javax.servlet.*;
public class test {

public static ServletContext context;
static Logger log = Logger.getLogger("example/test");

public test() {

        String homeDir = context.getRealPath("/");
        File propertiesFile = new File(homeDir, "WEB-INF/log4j.properties");
        PropertyConfigurator.configure(propertiesFile.toString());
        log.info("This is a test");
    }
}

Anda dapat menentukan konteks ServletContext statis dari file JSP lain. Contoh:

test.context = getServletContext(); 
test sample = new test(); 

Sekarang Anda dapat menggunakan file log4j.property di proyek Anda.

Ali Mamedov
sumber
5

Beberapa jawaban spesifik yang benar secara teknis sudah disediakan, tetapi secara umum, jawaban itu bisa berada di mana saja di kelas runtime, yaitu di mana pun kelas dicari oleh JVM.

Ini bisa berupa direktori / src di Eclipse atau direktori WEB-INF / classes di aplikasi yang Anda gunakan, tetapi sebaiknya perhatikan konsep classpath dan mengapa file tersebut diletakkan di dalamnya, jangan hanya memperlakukan WEB-INF / kelas sebagai direktori "ajaib".

Brian
sumber
5

Saya telah menghabiskan banyak waktu untuk mencari tahu mengapa file log4j.properties tidak terlihat.
Lalu saya perhatikan itu terlihat untuk proyek hanya ketika itu di kedua MyProject / target / kelas / dan MyProject / src / main / sumber daya folder.
Semoga bermanfaat bagi seseorang.
PS: Proyek itu berbasis pakar.

RedCH
sumber
3

Saya menemukan bahwa Glassfish secara default melihat [lokasi pemasangan Glassfish] \ glassfish \ domain [domain Anda] \ sebagai direktori kerja default ... Anda dapat menjatuhkan file log4j.properties di lokasi ini dan menginisialisasi dalam kode Anda menggunakan PropertyConfigurator seperti yang telah disebutkan sebelumnya...

Properties props = System.getProperties();
System.out.println("Current working directory is " + props.getProperty("user.dir"));
PropertyConfigurator.configure("log4j.properties");
Durandal00
sumber
1

Saya tidak tahu ini cara yang benar. Tapi itu menyelesaikan masalah saya. letakkan file log4j.properties di "folder proyek" / config dan gunakan PropertyConfigurator.configure ("config // log4j.properties");

ini akan bekerja dengan IDE tetapi tidak ketika menjalankan file jar sendiri. Ketika Anda menjalankan file jar sendiri, cukup salin file log4j.properties ke folder tempat file jar berada. Ketika file jar dan properti di direktori yang sama itu berjalan dengan baik.

sampathpremarathna
sumber
1

Masukkan log4j.properties di classpath. Berikut adalah 2 kasus yang akan membantu Anda mengidentifikasi lokasi yang tepat - 1. Untuk aplikasi web classpath adalah / WEB-INF / kelas.

\WEB-INF      
    classes\
        log4j.properties
  1. Untuk menguji dari main / unit test classpath adalah direktori sumber

    \Project\
       src\
          log4j.properties
Sharif
sumber
1

Ada banyak cara untuk melakukannya:

Way1: Jika Anda mencoba proyek maven tanpa Menggunakan PropertyConfigurator

Pertama: periksa direktori sumber daya di scr / main

  if available,
       then: create a .properties file and add all configuration details.
  else
       then: create a directory named resources and a file with .properties     
write your configuration code/details.

ikuti tangkapan layar:

! [masukkan deskripsi gambar di sini

Way2: Jika Anda mencoba dengan file Properties untuk proyek java / maven Gunakan PropertyConfigurator

Tempatkan file properti di mana saja dalam proyek dan berikan jalur yang benar. katakan: src / javaLog4jProperties / log4j.properties

statis{

 PropertyConfigurator.configure("src/javaLog4jProperties/log4j.properties");

}

masukkan deskripsi gambar di sini

Way3: Jika Anda mencoba dengan xml pada proyek java / maven Gunakan DOMConfigurator

Tempatkan file properti di mana saja dalam proyek dan berikan jalur yang benar. katakan: src / javaLog4jProperties / log4j.xml

statis{

 DOMConfigurator.configure("src/javaLog4jProperties/log4j.xml");

}

masukkan deskripsi gambar di sini

Shivendra Pandey
sumber
1

Setup proyek standar Anda akan memiliki struktur proyek seperti:

src/main/java
src/main/resources

Anda menempatkan log4j.properties di dalam folder sumber daya, Anda dapat membuat folder sumber daya jika tidak ada

Robert Squire
sumber
0

Sebenarnya, saya baru saja mengalami masalah ini dalam struktur proyek Java stardard sebagai berikut:

\myproject
    \src
    \libs
    \res\log4j.properties

Dalam Eclipse saya perlu menambahkan folder res untuk membangun path, namun, di Intellij, saya perlu menandai folder res sebagai sumber daya seperti yang ditunjukkan oleh screenshot yang ditautkan: klik kanan pada folder res dan tandai sebagai sumber daya .

Keajaiban Chan
sumber
0

Anda tidak perlu menentukan PropertyConfigurator.configure("log4j.properties");di kelas Log4J Anda, Jika Anda sudah mendefinisikan properti log4j.prop di struktur proyek Anda.

Dalam hal Proyek Dinamis Web: -

Anda perlu menyimpan log4j.properties di WebContent -> WEB-INF -> log4j.properties

Saya harap ini dapat membantu Anda.

Manish Patel
sumber