Tôi nên đặt tệp log4j.properIES ở đâu?


135

Tôi đã viết một dự án dịch vụ web bằng netbeans 6.7.1 với glassfish v2.1, đặt log4j.properies vào thư mục gốc của dự án và sử dụng:

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

trong Xây dựng:

PropertyConfigurator.configure("log4j.properties");

và trong các chức năng:

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

nhưng, đó là thông tin lỗi (thực ra, tôi đã cố gắng đặt nó gần như mọi thư mục mà tôi có thể nhận ra):

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.

dự án ví dụ có thể được lấy từ http://www.91files.com/?N3F0QGQPWMDGPBRN0QA8


2
Mục đích của PropertyConfigurator.configure ("log4j.properies") là gì; hàng ? Tôi không bao giờ sử dụng cái này. Tệp log4j.xml của bạn chỉ phải là "ở đâu đó" trong đường dẫn lớp của bạn.
Antoine Claval

1
Hãy xem stackoverflow.com/questions/1140353/ để tìm, cách cấu hình log4j đang được ghi lại. Tôi nghĩ rằng điều này sẽ giúp bạn rất nhiều, bởi vì một số container có cấu hình log4j của riêng họ.
dz.

@AntoineClaval Tôi đã xóa dòng nguyền rủa đó và nó hoạt động như một lá bùa. Man, thật là một chuyến đi ..
Siddharth

Câu trả lời:


113

Tôi biết rằng hơi muộn để trả lời câu hỏi này và có thể bạn đã tìm thấy giải pháp, nhưng tôi đang đăng giải pháp mà tôi đã tìm thấy (sau khi tôi googled rất nhiều) vì vậy nó có thể giúp một chút:

  1. Đặt log4j.properies trong các lớp WEB-INF \ của dự án như đã đề cập trước đó trong chủ đề này.
  2. Đặt log4j-xx.jar trong WEB-INF \ lib
  3. Kiểm tra xem log4j đã được tải chưa: add -Dlog4j.debug@ the end of java Tùy chọn tomcat của bạn

Hy vọng điều này sẽ giúp.

rgds


Sử dụng lệnh 'run' để có được tomcat ở phía trước; bạn có thể vượt qua trong các tùy chọn java thông qua dòng lệnh. Ngoài ra, tùy chọn -x để bash rất hữu ích để xem chính xác điều gì xảy ra với các tùy chọn của bạn: JAVA_OPTS = -Dlog4j.debug bash -x /usr/local/tomcat/bin/catalina.sh chạy
RoyM

50

Như đã nêu, log4j.properies nên nằm trong một thư mục được bao gồm trong đường dẫn lớp, tôi muốn thêm rằng trong một dự án đã được chỉnh sửa, một vị trí tốt có thể là src/main/resources/log4j.properties


26

Bạn có thể chỉ định vị trí tệp cấu hình với đối số VM -Dlog4j.configuration = "tệp: / C: /workspace3/local/log4j.properies"


là tệp: / hoặc tệp: /// hoặc chỉ / path / to / file trên hệ thống unix?
morpheus

Đối với các cửa sổ, nó chỉ là tệp: /, tôi đoán unix là như nhau
Amalgovinus

Đây là câu trả lời duy nhất đưa nhiều môi trường vào tài khoản có các cấp độ nhật ký khác nhau.
Matt

Trên macOS, jvm.options của Liberty Server không sử dụng dấu ngoặc kép và sử dụng tệp: ///
wnm3

Chỉ là một bản cập nhật có thể giúp tiết kiệm một số sự thất vọng: nếu bạn đang sử dụng log4j2, tên của đối số đã được thay đổi thànhlog4j.configurationFile
dan.m là user 2311368

25

Bạn phải đặt nó trong thư mục gốc, tương ứng với bối cảnh thực hiện của bạn.

Thí dụ:

    MyProject
       src
           MyClass.java
           log4j.properties

Nếu bạn bắt đầu thực thi từ một dự án khác, bạn cần phải có tệp đó trong dự án được sử dụng để bắt đầu thực hiện. Ví dụ: nếu một dự án khác giữ một số bài kiểm tra JUnit, thì nó cũng cần phải có tệp log4j.properIES của nó.


Tôi đề nghị sử dụng log4j.xml thay vì log4j.properies. Bạn có nhiều lựa chọn hơn, nhận trợ giúp từ IDE của mình và cứ thế ...


trong ví dụ, tôi gần như đặt nó mọi thư mục. nhưng nó không hữu ích cho dự án triển khai Glassfish, vì GF không sao chép các thuộc tính vào thư mục chính xác. Có vẻ như GF làm mất nó.
mono

Thật ra, tôi nghĩ vấn đề là từ việc tự động triển khai netbeans. Tôi cố gắng triển khai bằng tệp chiến tranh trong bảng điều khiển quản trị, không sao cả. Tôi không biết mình có đúng không. Nếu tôi đúng, tại sao netbeans không triển khai các tệp này khi tự động triển khai dự án.
mono

nó đã làm việc ! nhưng nó không phù hợp ... nó nghĩ rằng nó tốt hơn nên được đặt trong một loại thư mục "tài nguyên".
Adams.H

17

Đối với Dự án dựa trên Maven, hãy giữ log4j.properies của bạn trong src / main / resource. Không có gì khác để làm!


Đó là nó và nó cũng tương tự đối với các tệp thuộc tính khác như XMLConfiguration trong Maven Project. Cảm ơn!
Ramon

13

Nếu bạn đặt log4j.properies trong src, bạn không cần sử dụng câu lệnh -

PropertyConfigurator.configure("log4j.properties");

Nó sẽ được lấy tự động vì tệp thuộc tính nằm trong đường dẫn lớp.


10

Thử:

PropertyConfigurator.configure(getClass().getResource("/controlador/log4j.properties"));

9

Tệp phải được đặt trong thư mục WEB-INF / class. Cấu trúc thư mục này nên được đóng gói trong tập tin chiến tranh.


về lý thuyết, đó là câu trả lời, nhưng vấn đề là log4j.properies bị mất khi cá thủy tinh triển khai tệp chiến tranh.
mono

3
Nó phải ở trong WEB-INF / lớp và được đóng gói trong tệp chiến tranh
Martin OConnor

@mono - ít nhất là trong kho lưu trữ có thể tải xuống, KHÔNG có log4j.properies trong web / WEB-INF / lớp. Martin đã đúng, đó là nơi cần phải có.
fvu

Thủ thuật là, bạn đặt nó vào thư mục src của bạn, (Thư mục nguồn gốc của bạn), trong quá trình Xây dựng mã của bạn, tệp sẽ được tự động chuyển vào thư mục lớp ...
Mostafa Zeinali 22/215

7

IDE của tôi là NetBeans. Tôi đặt tệp log4j.property như trong hình

Nguồn gốc

thư mục gốc của dự án

Web

thư mục web

WEB-INF

Thư mục WEB-INF

Để sử dụng tệp thuộc tính này, bạn nên viết mã này:

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");
    }
}

Bạn có thể định nghĩa bối cảnh ServletContext tĩnh từ một tệp JSP khác. Thí dụ:

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

Bây giờ bạn có thể sử dụng tệp log4j.property trong các dự án của bạn.


5

Một vài câu trả lời cụ thể đúng về mặt kỹ thuật đã được cung cấp nhưng nói chung, nó có thể ở bất kỳ đâu trên đường dẫn lớp thời gian chạy, tức là bất cứ nơi nào các lớp được JVM tìm kiếm.

Đây có thể là thư mục / src trong Eclipse hoặc thư mục WEB-INF / class trong ứng dụng đã triển khai của bạn, nhưng tốt nhất bạn nên biết khái niệm classpath và tại sao tệp được đặt trong đó, đừng chỉ xử lý WEB-INF / các lớp như một thư mục "ma thuật".


5

Tôi đã dành rất nhiều thời gian để tìm hiểu tại sao không thấy tệp log4j.properIES .
Sau đó, tôi nhận thấy nó chỉ hiển thị cho dự án khi nó nằm trong cả hai thư mục MyProject / target / class /MyProject / src / main / resource .
Hy vọng nó sẽ hữu ích cho ai đó.
PS: Dự án dựa trên maven.


3

Tôi thấy rằng Glassfish theo mặc định đang xem [Vị trí cài đặt Glassfish] \ glassfish \ domain [tên miền của bạn] \ làm thư mục làm việc mặc định ... bạn có thể thả tệp log4j.properies vào vị trí này và khởi tạo nó trong mã của mình bằng PropertyConfigurator như đã nói ở trên...

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

1

Tôi không biết đây là cách chính xác. Nhưng nó đã giải quyết vấn đề của tôi. đặt tệp log4j.properIES trong "thư mục dự án" / config và sử dụng PropertyConfigurator.configure ("config // log4j.properies");

nó sẽ hoạt động với IDE nhưng không phải khi tự chạy tệp jar. Khi bạn tự chạy tệp jar, chỉ cần sao chép tệp log4j.properIES vào thư mục chứa tệp jar. Khi tệp jar và thuộc tính trong cùng thư mục, nó sẽ chạy tốt.


1

Đặt log4j.properies trong classpath. Dưới đây là 2 trường hợp sẽ giúp bạn xác định vị trí thích hợp- 1. Đối với ứng dụng web, đường dẫn lớp là / WEB-INF / lớp.

\WEB-INF      
    classes\
        log4j.properties
  1. Để kiểm tra từ kiểm tra chính / đơn vị, đường dẫn lớp là thư mục nguồn

    \Project\
       src\
          log4j.properties

1

Có rất nhiều cách để làm điều đó:

Way1: Nếu bạn đang thử trong dự án maven mà không sử dụng PropertyConfigurator

Đầu tiên: kiểm tra thư mục tài nguyên tại 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.

theo ảnh chụp màn hình:

! [nhập mô tả hình ảnh ở đây

Way2: Nếu bạn đang thử với tệp Thuộc tính cho dự án java / maven Sử dụng PropertyConfigurator

Đặt tệp thuộc tính bất cứ nơi nào trong dự án và đưa ra đường dẫn chính xác. nói: src / javaLog4jProperIES / log4j.properies

tĩnh {

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

}

nhập mô tả hình ảnh ở đây

Way3: Nếu bạn đang thử với xml trên dự án java / maven Sử dụng DOMConfigurator

Đặt tệp thuộc tính bất cứ nơi nào trong dự án và đưa ra đường dẫn chính xác. nói: src / javaLog4jProperIES / log4j.xml

tĩnh {

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

}

nhập mô tả hình ảnh ở đây


1

Thiết lập dự án tiêu chuẩn của bạn sẽ có cấu trúc dự án giống như:

src/main/java
src/main/resources

Bạn đặt log4j.properies trong thư mục tài nguyên, bạn có thể tạo thư mục tài nguyên nếu không tồn tại


0

Trên thực tế, tôi vừa trải qua vấn đề này trong cấu trúc dự án Java mạnh mẽ như sau:

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

Trong Eclipse tôi cần thêm thư mục res để xây dựng đường dẫn, tuy nhiên, trong Intellij, tôi cần đánh dấu thư mục res là resouces như ảnh chụp màn hình được liên kết hiển thị: nhấp chuột phải vào thư mục res và đánh dấu là tài nguyên .


0

Bạn không cần chỉ định PropertyConfigurator.configure("log4j.properties");trong lớp Log4J, Nếu bạn đã xác định log4j.properies trong cấu trúc dự án của bạn.

Trong trường hợp Dự án Web Dynamic: -

Bạn cần lưu log4j.properies của mình trong WebContent -> WEB-INF -> log4j.properies

Tôi hy vọng điều này có thể giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.