【问题标题】:Example of source for NTEventLogAppender?NTEventLogAppender 的源代码示例?
【发布时间】:2026-01-01 20:55:01
【问题描述】:

我正在尝试学习如何从 java eclipse 登录到事件查看器,并且我已经阅读了 api、各种站点以及关于堆栈溢出的类似问题。

但是当我按照步骤进行时,我总是会得到:

Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.log4j.nt.NTEventLogAppender.registerEventSource(Ljava/lang/String;Ljava/lang/String;)I
at org.apache.log4j.nt.NTEventLogAppender.registerEventSource(Native Method)
at org.apache.log4j.nt.NTEventLogAppender.<init>(NTEventLogAppender.java:79)
at org.apache.log4j.nt.NTEventLogAppender.<init>(NTEventLogAppender.java:65)

来源应该是什么?

如果有人能展示这样一个程序的完整示例,那就太好了。请尽可能详细,谢谢。

我现在的代码是:

package Output;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.nt.NTEventLogAppender;

public class EventLog {
    public static void main(String[] args) 
    {   

        Logger myLogger = Logger.getLogger(EventLog.class);

        String mySource = "the source";
        PatternLayout myLayout = new PatternLayout("[%c][%l][%p][%thread]: %m%n");

        NTEventLogAppender eventLogAppender= new NTEventLogAppender(mySource,myLayout);

        ConsoleAppender consoleAppender= new ConsoleAppender(myLayout);

        myLogger.addAppender(consoleAppender);
        myLogger.addAppender(eventLogAppender);

        myLogger.setLevel(Level.WARN);

        myLogger.fatal("Come on print");
    }    
}

【问题讨论】:

    标签: logging log4j event-log event-viewer


    【解决方案1】:

    不用这个,使用 eventcreate.exe 命令...它做同样的工作而且更容易`

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Locale;
    import java.util.concurrent.TimeUnit;
    import java.util.stream.Collectors;
    
    public class WriteToWindowsEventLog {
       static int id=0;
        public void log(String source,String level,String message)  throws IOException, InterruptedException{
            String osName = System.getProperty("os.name").toUpperCase(Locale.ENGLISH);
            if (!osName.startsWith("WINDOWS")) {
                System.err.println("Not windows");
                return;
            } 
            id++;
    
            String command = "eventcreate "
                    + " /l APPLICATION"
                    + " /so \"" + source + "\""
                    + " /t " +level
                    + " /id " + id
                    + " /d \"" + message + "\"";
    
    
            Process process = Runtime.getRuntime().exec(command);
            process.waitFor(10, TimeUnit.SECONDS);
            int exitValue = process.exitValue();
            if (exitValue != 0) {
                InputStream errorStream = process.getErrorStream();
                String result = new BufferedReader(new InputStreamReader(errorStream))
                    .lines()
                    .collect(Collectors.joining("\n"));
                System.err.println(result);
            }
        }
    
    }
    

    `

    【讨论】:

      【解决方案2】:

      我也在研究如何做到这一点。我没有足够的时间来测试这个答案,但从我所读到的错误是由于在正确的位置没有正确的 .dll 文件引起的。

      "不要忘记将 NTEventLogAppender.dll、NTEventLogAppender.amd64.dll、NTEventLogAppender.ia64.dll 或 NTEventLogAppender.x86.dll 适当地放在 Windows 系统的 PATH 上的目录中。否则,您将得到java.lang.UnsatisfiedLinkError"

      【讨论】: