Java 为什么不’;我的log4j命令不能在main方法中识别吗?

Java 为什么不’;我的log4j命令不能在main方法中识别吗?,java,logging,log4j,Java,Logging,Log4j,以下是我的主要方法中的代码: public static void main(String argv[]) { log1.setLevel(org.apache.log4j.Level.TRACE); System.out.println("Log level set in Class1 is " + log1.getLevel());

以下是我的主要方法中的代码:

public static void main(String argv[]) {
                        
            log1.setLevel(org.apache.log4j.Level.TRACE);
            System.out.println("Log level set in Class1 is " + log1.getLevel());
            
            log2.setLevel(org.apache.log4j.Level.TRACE);
            System.out.println("Log level set in Class2 is " + log2.getLevel());
            
            Class1.doLog();
            Class2.doLog();
}
以下是我的类中的日志语句:

public static class Class1 {
            
            public static org.apache.log4j.Logger log1 = org.apache.log4j.Logger.getLogger(NewClass1.class);
                        
            static void doLog() {

                System.out.println("Log level in Class1.doLog() is " + log1.getLevel());
                log1.trace("Trace Message! - Class1.doLog()");
                log1.debug("Debug Message! - Class1.doLog()");
                log1.info("Info Message! - Class1.doLog()");
                log1.warn("Warn Message! - Class1.doLog()");
                log1.error("Error Message! - Class1.doLog()");
                log1.fatal("Fatal Message! - Class1.doLog()");
            }
}
我试图在自定义类中创建一个记录器;我还在类的方法中创建了日志记录语句。我的Netbeans编译器在main中显示了日志命令的错误消息:找不到符号

我按照Netbeans的建议创建了自己的日志类和方法;控制台输出未在控制台中正确显示(即,缺少行号、更改的日志级别未正确读取等)——它们无法识别导入的记录器库中的日志命令


我在这里看到的错误是,您正在创建log1log2Class1Class2中的对象,这是main方法无法访问的。您创建的两个日志变量都是您创建的类的本地变量。尝试在声明的主类之后声明这两个对象

因此,在进行更改后,代码将如下所示:

    class Main {
             
             public static org.apache.log4j.Logger log1 = org.apache.log4j.Logger.getLogger(NewClass1.class);
             public static org.apache.log4j.Logger log1 = org.apache.log4j.Logger.getLogger(NewClass1.class);

             public static class Class1 {
            
                  log1 = org.apache.log4j.Logger.getLogger(Class1.class);
                        
                  static void doLog() {

                       System.out.println("Log level in Class1.doLog() is " + log1.getLevel());
                       log1.trace("Trace Message! - Class1.doLog()");
                       log1.debug("Debug Message! - Class1.doLog()");
                       log1.info("Info Message! - Class1.doLog()");
                       log1.warn("Warn Message! - Class1.doLog()");
                       log1.error("Error Message! - Class1.doLog()");
                       log1.fatal("Fatal Message! - Class1.doLog()");
                 }
             }
             public static class Class2 {
            
                  log2 = org.apache.log4j.Logger.getLogger(Class2.class);
                        
                  static void doLog() {

                       System.out.println("Log level in Class1.doLog() is " + log1.getLevel());
                       log1.trace("Trace Message! - Class1.doLog()");
                       log1.debug("Debug Message! - Class1.doLog()");
                       log1.info("Info Message! - Class1.doLog()");
                       log1.warn("Warn Message! - Class1.doLog()");
                       log1.error("Error Message! - Class1.doLog()");
                       log1.fatal("Fatal Message! - Class1.doLog()");
                 }
             }
             public static void main(String argv[]) {
                    
                 log1.setLevel(org.apache.log4j.Level.TRACE);
                 System.out.println("Log level set in Class1 is " + log1.getLevel());
        
                 log2.setLevel(org.apache.log4j.Level.TRACE);
                 System.out.println("Log level set in Class2 is " + log2.getLevel());
        
                 Class1.doLog();
                 Class2.doLog();
        }
   }
public static void main(String argv[]) {
                    
        Class1.log1.setLevel(org.apache.log4j.Level.TRACE);
        System.out.println("Log level set in Class1 is " + log1.getLevel());
        
        Class2.log2.setLevel(org.apache.log4j.Level.TRACE);
        System.out.println("Log level set in Class2 is " + log2.getLevel());
        
        Class1.doLog();
        Class2.doLog();
}
使用main方法中的log对象应该可以很好地工作

另一种方法

如果您不希望全局声明变量并希望访问日志对象。由于已将变量声明为静态变量,因此可以使用类名直接调用它们

因此,主要方法如下所示:

    class Main {
             
             public static org.apache.log4j.Logger log1 = org.apache.log4j.Logger.getLogger(NewClass1.class);
             public static org.apache.log4j.Logger log1 = org.apache.log4j.Logger.getLogger(NewClass1.class);

             public static class Class1 {
            
                  log1 = org.apache.log4j.Logger.getLogger(Class1.class);
                        
                  static void doLog() {

                       System.out.println("Log level in Class1.doLog() is " + log1.getLevel());
                       log1.trace("Trace Message! - Class1.doLog()");
                       log1.debug("Debug Message! - Class1.doLog()");
                       log1.info("Info Message! - Class1.doLog()");
                       log1.warn("Warn Message! - Class1.doLog()");
                       log1.error("Error Message! - Class1.doLog()");
                       log1.fatal("Fatal Message! - Class1.doLog()");
                 }
             }
             public static class Class2 {
            
                  log2 = org.apache.log4j.Logger.getLogger(Class2.class);
                        
                  static void doLog() {

                       System.out.println("Log level in Class1.doLog() is " + log1.getLevel());
                       log1.trace("Trace Message! - Class1.doLog()");
                       log1.debug("Debug Message! - Class1.doLog()");
                       log1.info("Info Message! - Class1.doLog()");
                       log1.warn("Warn Message! - Class1.doLog()");
                       log1.error("Error Message! - Class1.doLog()");
                       log1.fatal("Fatal Message! - Class1.doLog()");
                 }
             }
             public static void main(String argv[]) {
                    
                 log1.setLevel(org.apache.log4j.Level.TRACE);
                 System.out.println("Log level set in Class1 is " + log1.getLevel());
        
                 log2.setLevel(org.apache.log4j.Level.TRACE);
                 System.out.println("Log level set in Class2 is " + log2.getLevel());
        
                 Class1.doLog();
                 Class2.doLog();
        }
   }
public static void main(String argv[]) {
                    
        Class1.log1.setLevel(org.apache.log4j.Level.TRACE);
        System.out.println("Log level set in Class1 is " + log1.getLevel());
        
        Class2.log2.setLevel(org.apache.log4j.Level.TRACE);
        System.out.println("Log level set in Class2 is " + log2.getLevel());
        
        Class1.doLog();
        Class2.doLog();
}

非常感谢!您的第二种方法很有用-但是,行号没有记录在log4j控制台语句中;关于如何解决这个问题有什么建议吗?你在任何地方都记录了行号吗?我看你没有这样做。我只把它们放在我的log4j.xml文件中:-%L是代码中的行号,如果我在更新xml文件之前更改了日志级别,行号就会显示出来。如果在更新XML文件后更改日志级别,则找不到行号。在停止日志记录之后,您在XML文件中进行了哪些更改?