Skip to content

Commit

Permalink
Allow setting an application name, event and category message file an…
Browse files Browse the repository at this point in the history
…d rethrow an exception on failing to de-register.
  • Loading branch information
tonyniemira authored and dblock committed Oct 28, 2013
1 parent 5e13b9e commit 3669ce4
Show file tree
Hide file tree
Showing 4 changed files with 236 additions and 89 deletions.
13 changes: 10 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
Next Release
------------

* [#3](https://github.com/dblock/log4jna/pull/3): Allow setting of an application name as log4j parameters - [@tonyniemira](https://github.com/tonyniemira).
* [#3](https://github.com/dblock/log4jna/pull/3): Allow setting of an event and category message file - [@tonyniemira](https://github.com/tonyniemira).
* [#3](https://github.com/dblock/log4jna/pull/3): Re-throw `Win32Exception` when failing to deregister the event source - [@tonyniemira](https://github.com/tonyniemira).

1.2 (5/26/2013)
===============
---------------

* [#2](https://github.com/dblock/log4jna/pull/2): Added ability to change the log name - [@marmstrong](https://github.com/marmstrong).

1.1 (6/13/2012)
===============
---------------

* [#1](https://github.com/dblock/log4jna/pull/1): Using error handler instead of throwing exceptions - [@kjeldahl](https://github.com/kjeldahl).

1.0 (9/28/2010)
===============
---------------

* Initial public release - [@dblock](https://github.com/dblock)
32 changes: 32 additions & 0 deletions demo/src/log4j.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?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 [%t] %m%n" />
</layout>
</appender>

<appender name="WINDOWS" class="org.apache.log4jna.nt.Win32EventLogAppender">

<param name="source" value="MyLogs" />
<param name="application" value="TestApp" />
<param name="eventMessageFile"
value="<mypath>\\win32dll\\Win32EventLogAppender.dll" />
<param name="categoryMessageFile"
value="<mypath>\\win32dll\\Win32EventLogAppender.dll" />

<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p [%t] %m%n" />
</layout>
</appender>

<root>
<priority value="info" />
<appender-ref ref="WINDOWS" />
<appender-ref ref="console" />
</root>
</log4j:configuration>
123 changes: 89 additions & 34 deletions log4jna/src-test/org/apache/log4jna/nt/Win32EventLogAppenderTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,90 +17,145 @@

package org.apache.log4jna.nt;

import java.nio.file.Path;
import java.nio.file.Paths;

import junit.framework.TestCase;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;

import com.sun.jna.platform.win32.Advapi32Util;
import com.sun.jna.platform.win32.Advapi32Util.EventLogIterator;
import com.sun.jna.platform.win32.Advapi32Util.EventLogRecord;
import com.sun.jna.platform.win32.Advapi32Util.EventLogType;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.platform.win32.WinReg;

/**
*
* Win32EventLogAppender tests.
*
* @author Curt Arnold
* @author <a href="mailto:dblock@dblock.org">Daniel Doubrovkine</a>
* @author <a href="mailto:tony@niemira.com">Tony Niemira</a>
*
*/
public class Win32EventLogAppenderTest extends TestCase {

// If the events from this test need to be observed in the Windows Event
// Logger then ensure the Win32EventlogAppender.dll can be found at this
// location, or change as appropriate
private static String _eventLogAppenderDLL = "c:\\windows\\temp\\Win32EventlogAppender.dll";

private Logger _logger = null;

private Win32EventLogAppender _eventLogAppender = null;

public void setUp() {
BasicConfigurator.configure(new Win32EventLogAppender(null, null, "Log4jnaTest"));
_logger = Logger.getLogger(Win32EventLogAppenderTest.class);
_eventLogAppender = new Win32EventLogAppender();
_eventLogAppender.setSource("Log4jnaTest");
_eventLogAppender.setApplication("Log4jnaApplicationTest");
_eventLogAppender.setCategoryMessageFile(_eventLogAppenderDLL);
_eventLogAppender.setEventMessageFile(_eventLogAppenderDLL);
BasicConfigurator.configure(_eventLogAppender);
_logger = Logger.getLogger(Win32EventLogAppenderTest.class);
}

/**
* Clean up configuration after each test.
*/

public void tearDown() {
LogManager.shutdown();
}

public void testDebugEvent() {
String message = "log4jna debug message @ " + Kernel32.INSTANCE.GetTickCount();
String message = "log4jna debug message @ "
+ Kernel32.INSTANCE.GetTickCount();
_logger.debug(message);
expectEvent(message, Level.DEBUG, EventLogType.Informational);
}

public void testInfoEvent() {
String message = "log4jna info message @ " + Kernel32.INSTANCE.GetTickCount();
String message = "log4jna info message @ "
+ Kernel32.INSTANCE.GetTickCount();
_logger.info(message);
expectEvent(message, Level.INFO, EventLogType.Informational);
expectEvent(message, Level.INFO, EventLogType.Informational);
}

public void testWarnEvent() {
String message = "log4jna warn message @ " + Kernel32.INSTANCE.GetTickCount();
String message = "log4jna warn message @ "
+ Kernel32.INSTANCE.GetTickCount();
_logger.warn(message);
expectEvent(message, Level.WARN, EventLogType.Warning);
expectEvent(message, Level.WARN, EventLogType.Warning);
}

public void testFatalEvent() {
String message = "log4jna fatal message @ " + Kernel32.INSTANCE.GetTickCount();
String message = "log4jna fatal message @ "
+ Kernel32.INSTANCE.GetTickCount();
_logger.log(Level.FATAL, message);
expectEvent(message, Level.FATAL, EventLogType.Error);
expectEvent(message, Level.FATAL, EventLogType.Error);
}

/*
public void testException() {
String message = "log4jna exception message @ " + Kernel32.INSTANCE.GetTickCount();
_logger.debug(message, new Exception("testing exception"));
expectEvent(message, Level.DEBUG, EventLogType.Informational);

public void testRegistryValues() {
String eventSourceKeyPath = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\"
+ _eventLogAppender.getApplication() + "\\" + _eventLogAppender.getSource();

String eventMessageFileInRegistry = Advapi32Util
.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE,
eventSourceKeyPath, "EventMessageFile");

Path eventMessageFileGiven = Paths.get(_eventLogAppenderDLL);
assertEquals(eventMessageFileInRegistry,
eventMessageFileGiven.toString());

String categoryMessageFileInRegistry = Advapi32Util
.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE,
eventSourceKeyPath, "CategoryMessageFile");

Path categoryMessageFileGiven = Paths.get(_eventLogAppenderDLL);
assertEquals(categoryMessageFileInRegistry,
categoryMessageFileGiven.toString());
}
*/

private void expectEvent(String message, Level level, EventLogType eventLogType) {
EventLogIterator iter = new EventLogIterator(null, "Log4jnaTest", WinNT.EVENTLOG_BACKWARDS_READ);

/*
* public void testException() { String message =
* "log4jna exception message @ " + Kernel32.INSTANCE.GetTickCount();
* _logger.debug(message, new Exception("testing exception"));
* expectEvent(message, Level.DEBUG, EventLogType.Informational); }
*/

private void expectEvent(String message, Level level,
EventLogType eventLogType) {
EventLogIterator iter = new EventLogIterator(null, "Log4jnaTest",
WinNT.EVENTLOG_BACKWARDS_READ);
try {
assertTrue(iter.hasNext());
EventLogRecord record = iter.next();
assertEquals("Log4jna", record.getSource());
assertEquals(eventLogType, record.getType());
assertEquals("Log4jnaTest", record.getSource());

assertEquals(eventLogType, record.getType());
assertEquals(1, record.getRecord().NumStrings.intValue());
assertNull(record.getData());
String fullMessage = level + " " + Win32EventLogAppenderTest.class.getCanonicalName() + " - " + message;
String eventMessage = record.getStrings()[0].trim();

// The full message includes a level and the full class name
String fullMessage = level + " "
+ Win32EventLogAppenderTest.class.getCanonicalName()
+ " - " + message;

// The event message has the location tacked on the front
StringBuilder eventMessage = new StringBuilder();
for (int i = 0; i < record.getStrings().length; i++) {
eventMessage.append(record.getStrings()[i].trim());
}

System.out.println(eventMessage.toString());

int levelMarker = eventMessage.indexOf(level.toString());
assertTrue("missing level marker in '" + eventMessage + "'", levelMarker >= 0);
String eventMessageWithoutLocation = eventMessage.substring(levelMarker);
assertTrue("missing level marker in '" + eventMessage + "'",
levelMarker >= 0);
String eventMessageWithoutLocation = eventMessage
.substring(levelMarker);
assertEquals(fullMessage, eventMessageWithoutLocation);
System.out.println(record.getStrings()[0]);
} finally {
iter.close();
}
Expand Down
Loading

0 comments on commit 3669ce4

Please sign in to comment.