1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.nt;
19
20 import org.apache.log4j.AppenderSkeleton;
21 import org.apache.log4j.Layout;
22 import org.apache.log4j.TTCCLayout;
23 import org.apache.log4j.helpers.LogLog;
24 import org.apache.log4j.spi.LoggingEvent;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public class NTEventLogAppender extends AppenderSkeleton {
42 private int _handle = 0;
43
44 private String source = null;
45 private String server = null;
46
47
48 public NTEventLogAppender() {
49 this(null, null, null);
50 }
51
52 public NTEventLogAppender(String source) {
53 this(null, source, null);
54 }
55
56 public NTEventLogAppender(String server, String source) {
57 this(server, source, null);
58 }
59
60 public NTEventLogAppender(Layout layout) {
61 this(null, null, layout);
62 }
63
64 public NTEventLogAppender(String source, Layout layout) {
65 this(null, source, layout);
66 }
67
68 public NTEventLogAppender(String server, String source, Layout layout) {
69 if (source == null) {
70 source = "Log4j";
71 }
72 if (layout == null) {
73 this.layout = new TTCCLayout();
74 } else {
75 this.layout = layout;
76 }
77
78 try {
79 _handle = registerEventSource(server, source);
80 } catch (Exception e) {
81 e.printStackTrace();
82 _handle = 0;
83 }
84 }
85
86 public
87 void close() {
88
89 }
90
91 public
92 void activateOptions() {
93 if (source != null) {
94 try {
95 _handle = registerEventSource(server, source);
96 } catch (Exception e) {
97 LogLog.error("Could not register event source.", e);
98 _handle = 0;
99 }
100 }
101 }
102
103
104 public void append(LoggingEvent event) {
105
106 StringBuffer sbuf = new StringBuffer();
107
108 sbuf.append(layout.format(event));
109 if(layout.ignoresThrowable()) {
110 String[] s = event.getThrowableStrRep();
111 if (s != null) {
112 int len = s.length;
113 for(int i = 0; i < len; i++) {
114 sbuf.append(s[i]);
115 }
116 }
117 }
118
119 int nt_category = event.getLevel().toInt();
120
121
122
123
124
125 reportEvent(_handle, sbuf.toString(), nt_category);
126 }
127
128
129 public
130 void finalize() {
131 deregisterEventSource(_handle);
132 _handle = 0;
133 }
134
135
136
137
138
139 public
140 void setSource(String source) {
141 this.source = source.trim();
142 }
143
144 public
145 String getSource() {
146 return source;
147 }
148
149
150
151
152 public
153 boolean requiresLayout() {
154 return true;
155 }
156
157 native private int registerEventSource(String server, String source);
158 native private void reportEvent(int handle, String message, int level);
159 native private void deregisterEventSource(int handle);
160
161 static {
162 String[] archs;
163 try {
164 archs = new String[] { System.getProperty("os.arch")};
165 } catch(SecurityException e) {
166 archs = new String[] { "amd64", "ia64", "x86"};
167 }
168 boolean loaded = false;
169 for(int i = 0; i < archs.length; i++) {
170 try {
171 System.loadLibrary("NTEventLogAppender." + archs[i]);
172 loaded = true;
173 break;
174 } catch(java.lang.UnsatisfiedLinkError e) {
175 loaded = false;
176 }
177 }
178 if (!loaded) {
179 System.loadLibrary("NTEventLogAppender");
180 }
181 }
182 }