Skip to content

Commit 3669ce4

Browse files
tonyniemiradblock
authored andcommitted
Allow setting an application name, event and category message file and rethrow an exception on failing to de-register.
1 parent 5e13b9e commit 3669ce4

File tree

4 files changed

+236
-89
lines changed

4 files changed

+236
-89
lines changed

CHANGELOG.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,21 @@
1+
Next Release
2+
------------
3+
4+
* [#3](https://github.com/dblock/log4jna/pull/3): Allow setting of an application name as log4j parameters - [@tonyniemira](https://github.com/tonyniemira).
5+
* [#3](https://github.com/dblock/log4jna/pull/3): Allow setting of an event and category message file - [@tonyniemira](https://github.com/tonyniemira).
6+
* [#3](https://github.com/dblock/log4jna/pull/3): Re-throw `Win32Exception` when failing to deregister the event source - [@tonyniemira](https://github.com/tonyniemira).
7+
18
1.2 (5/26/2013)
2-
===============
9+
---------------
310

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

613
1.1 (6/13/2012)
7-
===============
14+
---------------
815

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

1118
1.0 (9/28/2010)
12-
===============
19+
---------------
1320

1421
* Initial public release - [@dblock](https://github.com/dblock)

demo/src/log4j.xml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
3+
4+
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
5+
6+
<appender name="console" class="org.apache.log4j.ConsoleAppender">
7+
<param name="Target" value="System.out" />
8+
<layout class="org.apache.log4j.PatternLayout">
9+
<param name="ConversionPattern" value="%-5p [%t] %m%n" />
10+
</layout>
11+
</appender>
12+
13+
<appender name="WINDOWS" class="org.apache.log4jna.nt.Win32EventLogAppender">
14+
15+
<param name="source" value="MyLogs" />
16+
<param name="application" value="TestApp" />
17+
<param name="eventMessageFile"
18+
value="<mypath>\\win32dll\\Win32EventLogAppender.dll" />
19+
<param name="categoryMessageFile"
20+
value="<mypath>\\win32dll\\Win32EventLogAppender.dll" />
21+
22+
<layout class="org.apache.log4j.PatternLayout">
23+
<param name="ConversionPattern" value="%-5p [%t] %m%n" />
24+
</layout>
25+
</appender>
26+
27+
<root>
28+
<priority value="info" />
29+
<appender-ref ref="WINDOWS" />
30+
<appender-ref ref="console" />
31+
</root>
32+
</log4j:configuration>

log4jna/src-test/org/apache/log4jna/nt/Win32EventLogAppenderTest.java

Lines changed: 89 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -17,90 +17,145 @@
1717

1818
package org.apache.log4jna.nt;
1919

20+
import java.nio.file.Path;
21+
import java.nio.file.Paths;
22+
2023
import junit.framework.TestCase;
2124

2225
import org.apache.log4j.BasicConfigurator;
2326
import org.apache.log4j.Level;
2427
import org.apache.log4j.LogManager;
2528
import org.apache.log4j.Logger;
2629

30+
import com.sun.jna.platform.win32.Advapi32Util;
2731
import com.sun.jna.platform.win32.Advapi32Util.EventLogIterator;
2832
import com.sun.jna.platform.win32.Advapi32Util.EventLogRecord;
2933
import com.sun.jna.platform.win32.Advapi32Util.EventLogType;
3034
import com.sun.jna.platform.win32.Kernel32;
3135
import com.sun.jna.platform.win32.WinNT;
36+
import com.sun.jna.platform.win32.WinReg;
3237

3338
/**
3439
*
3540
* Win32EventLogAppender tests.
3641
*
3742
* @author Curt Arnold
3843
* @author <a href="mailto:dblock@dblock.org">Daniel Doubrovkine</a>
44+
* @author <a href="mailto:tony@niemira.com">Tony Niemira</a>
45+
*
3946
*/
4047
public class Win32EventLogAppenderTest extends TestCase {
4148

49+
// If the events from this test need to be observed in the Windows Event
50+
// Logger then ensure the Win32EventlogAppender.dll can be found at this
51+
// location, or change as appropriate
52+
private static String _eventLogAppenderDLL = "c:\\windows\\temp\\Win32EventlogAppender.dll";
53+
4254
private Logger _logger = null;
43-
55+
private Win32EventLogAppender _eventLogAppender = null;
56+
4457
public void setUp() {
45-
BasicConfigurator.configure(new Win32EventLogAppender(null, null, "Log4jnaTest"));
46-
_logger = Logger.getLogger(Win32EventLogAppenderTest.class);
58+
_eventLogAppender = new Win32EventLogAppender();
59+
_eventLogAppender.setSource("Log4jnaTest");
60+
_eventLogAppender.setApplication("Log4jnaApplicationTest");
61+
_eventLogAppender.setCategoryMessageFile(_eventLogAppenderDLL);
62+
_eventLogAppender.setEventMessageFile(_eventLogAppenderDLL);
63+
BasicConfigurator.configure(_eventLogAppender);
64+
_logger = Logger.getLogger(Win32EventLogAppenderTest.class);
4765
}
48-
49-
/**
50-
* Clean up configuration after each test.
51-
*/
66+
5267
public void tearDown() {
5368
LogManager.shutdown();
5469
}
5570

5671
public void testDebugEvent() {
57-
String message = "log4jna debug message @ " + Kernel32.INSTANCE.GetTickCount();
72+
String message = "log4jna debug message @ "
73+
+ Kernel32.INSTANCE.GetTickCount();
5874
_logger.debug(message);
5975
expectEvent(message, Level.DEBUG, EventLogType.Informational);
6076
}
61-
77+
6278
public void testInfoEvent() {
63-
String message = "log4jna info message @ " + Kernel32.INSTANCE.GetTickCount();
79+
String message = "log4jna info message @ "
80+
+ Kernel32.INSTANCE.GetTickCount();
6481
_logger.info(message);
65-
expectEvent(message, Level.INFO, EventLogType.Informational);
82+
expectEvent(message, Level.INFO, EventLogType.Informational);
6683
}
67-
84+
6885
public void testWarnEvent() {
69-
String message = "log4jna warn message @ " + Kernel32.INSTANCE.GetTickCount();
86+
String message = "log4jna warn message @ "
87+
+ Kernel32.INSTANCE.GetTickCount();
7088
_logger.warn(message);
71-
expectEvent(message, Level.WARN, EventLogType.Warning);
89+
expectEvent(message, Level.WARN, EventLogType.Warning);
7290
}
73-
91+
7492
public void testFatalEvent() {
75-
String message = "log4jna fatal message @ " + Kernel32.INSTANCE.GetTickCount();
93+
String message = "log4jna fatal message @ "
94+
+ Kernel32.INSTANCE.GetTickCount();
7695
_logger.log(Level.FATAL, message);
77-
expectEvent(message, Level.FATAL, EventLogType.Error);
96+
expectEvent(message, Level.FATAL, EventLogType.Error);
7897
}
79-
80-
/*
81-
public void testException() {
82-
String message = "log4jna exception message @ " + Kernel32.INSTANCE.GetTickCount();
83-
_logger.debug(message, new Exception("testing exception"));
84-
expectEvent(message, Level.DEBUG, EventLogType.Informational);
98+
99+
public void testRegistryValues() {
100+
String eventSourceKeyPath = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\"
101+
+ _eventLogAppender.getApplication() + "\\" + _eventLogAppender.getSource();
102+
103+
String eventMessageFileInRegistry = Advapi32Util
104+
.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE,
105+
eventSourceKeyPath, "EventMessageFile");
106+
107+
Path eventMessageFileGiven = Paths.get(_eventLogAppenderDLL);
108+
assertEquals(eventMessageFileInRegistry,
109+
eventMessageFileGiven.toString());
110+
111+
String categoryMessageFileInRegistry = Advapi32Util
112+
.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE,
113+
eventSourceKeyPath, "CategoryMessageFile");
114+
115+
Path categoryMessageFileGiven = Paths.get(_eventLogAppenderDLL);
116+
assertEquals(categoryMessageFileInRegistry,
117+
categoryMessageFileGiven.toString());
85118
}
86-
*/
87-
88-
private void expectEvent(String message, Level level, EventLogType eventLogType) {
89-
EventLogIterator iter = new EventLogIterator(null, "Log4jnaTest", WinNT.EVENTLOG_BACKWARDS_READ);
119+
120+
/*
121+
* public void testException() { String message =
122+
* "log4jna exception message @ " + Kernel32.INSTANCE.GetTickCount();
123+
* _logger.debug(message, new Exception("testing exception"));
124+
* expectEvent(message, Level.DEBUG, EventLogType.Informational); }
125+
*/
126+
127+
private void expectEvent(String message, Level level,
128+
EventLogType eventLogType) {
129+
EventLogIterator iter = new EventLogIterator(null, "Log4jnaTest",
130+
WinNT.EVENTLOG_BACKWARDS_READ);
90131
try {
91132
assertTrue(iter.hasNext());
92133
EventLogRecord record = iter.next();
93-
assertEquals("Log4jna", record.getSource());
94-
assertEquals(eventLogType, record.getType());
134+
assertEquals("Log4jnaTest", record.getSource());
135+
136+
assertEquals(eventLogType, record.getType());
95137
assertEquals(1, record.getRecord().NumStrings.intValue());
96138
assertNull(record.getData());
97-
String fullMessage = level + " " + Win32EventLogAppenderTest.class.getCanonicalName() + " - " + message;
98-
String eventMessage = record.getStrings()[0].trim();
139+
140+
// The full message includes a level and the full class name
141+
String fullMessage = level + " "
142+
+ Win32EventLogAppenderTest.class.getCanonicalName()
143+
+ " - " + message;
144+
145+
// The event message has the location tacked on the front
146+
StringBuilder eventMessage = new StringBuilder();
147+
for (int i = 0; i < record.getStrings().length; i++) {
148+
eventMessage.append(record.getStrings()[i].trim());
149+
}
150+
151+
System.out.println(eventMessage.toString());
152+
99153
int levelMarker = eventMessage.indexOf(level.toString());
100-
assertTrue("missing level marker in '" + eventMessage + "'", levelMarker >= 0);
101-
String eventMessageWithoutLocation = eventMessage.substring(levelMarker);
154+
assertTrue("missing level marker in '" + eventMessage + "'",
155+
levelMarker >= 0);
156+
String eventMessageWithoutLocation = eventMessage
157+
.substring(levelMarker);
102158
assertEquals(fullMessage, eventMessageWithoutLocation);
103-
System.out.println(record.getStrings()[0]);
104159
} finally {
105160
iter.close();
106161
}

0 commit comments

Comments
 (0)