X-Git-Url: http://source.jalview.org/gitweb/?p=jalview.git;a=blobdiff_plain;f=srcjar%2Forg%2Fapache%2Flog4j%2Fnt%2FNTEventLogAppender.java;fp=srcjar%2Forg%2Fapache%2Flog4j%2Fnt%2FNTEventLogAppender.java;h=9f80addfcba734d4107b73716a252c1fe566ec0e;hp=0000000000000000000000000000000000000000;hb=2d6292c0377bc6b773c6844a45d3f2c5fac352c7;hpb=954af328a2a6a0055572cd1a09ee035301222574 diff --git a/srcjar/org/apache/log4j/nt/NTEventLogAppender.java b/srcjar/org/apache/log4j/nt/NTEventLogAppender.java new file mode 100644 index 0000000..9f80add --- /dev/null +++ b/srcjar/org/apache/log4j/nt/NTEventLogAppender.java @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.log4j.nt; + +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.Layout; +import org.apache.log4j.TTCCLayout; +import org.apache.log4j.helpers.LogLog; +import org.apache.log4j.spi.LoggingEvent; + + +/** + Append to the NT event log system. + +

WARNING This appender can only be installed and used on a + Windows system. + +

Do not forget to place NTEventLogAppender.dll, + NTEventLogAppender.amd64.dll, NTEventLogAppender.ia64.dll + or NTEventLogAppender.x86.dll as appropriate in a + directory that is on the PATH of the Windows system. Otherwise, you + will get a java.lang.UnsatisfiedLinkError. + + @author Chris Taylor + @author Jim Cakalic */ +public class NTEventLogAppender extends AppenderSkeleton { + private int _handle = 0; + + private String source = null; + private String server = null; + + + public NTEventLogAppender() { + this(null, null, null); + } + + public NTEventLogAppender(String source) { + this(null, source, null); + } + + public NTEventLogAppender(String server, String source) { + this(server, source, null); + } + + public NTEventLogAppender(Layout layout) { + this(null, null, layout); + } + + public NTEventLogAppender(String source, Layout layout) { + this(null, source, layout); + } + + public NTEventLogAppender(String server, String source, Layout layout) { + if (source == null) { + source = "Log4j"; + } + if (layout == null) { + this.layout = new TTCCLayout(); + } else { + this.layout = layout; + } + + try { + _handle = registerEventSource(server, source); + } catch (Exception e) { + e.printStackTrace(); + _handle = 0; + } + } + + public + void close() { + // unregister ... + } + + public + void activateOptions() { + if (source != null) { + try { + _handle = registerEventSource(server, source); + } catch (Exception e) { + LogLog.error("Could not register event source.", e); + _handle = 0; + } + } + } + + + public void append(LoggingEvent event) { + + StringBuffer sbuf = new StringBuffer(); + + sbuf.append(layout.format(event)); + if(layout.ignoresThrowable()) { + String[] s = event.getThrowableStrRep(); + if (s != null) { + int len = s.length; + for(int i = 0; i < len; i++) { + sbuf.append(s[i]); + } + } + } + // Normalize the log message level into the supported categories + int nt_category = event.getLevel().toInt(); + + // Anything above FATAL or below DEBUG is labeled as INFO. + //if (nt_category > FATAL || nt_category < DEBUG) { + // nt_category = INFO; + //} + reportEvent(_handle, sbuf.toString(), nt_category); + } + + + public + void finalize() { + deregisterEventSource(_handle); + _handle = 0; + } + + /** + The Source option which names the source of the event. The + current value of this constant is Source. + */ + public + void setSource(String source) { + this.source = source.trim(); + } + + public + String getSource() { + return source; + } + +/** + The NTEventLogAppender requires a layout. Hence, + this method always returns true. */ + public + boolean requiresLayout() { + return true; + } + + native private int registerEventSource(String server, String source); + native private void reportEvent(int handle, String message, int level); + native private void deregisterEventSource(int handle); + + static { + String[] archs; + try { + archs = new String[] { System.getProperty("os.arch")}; + } catch(SecurityException e) { + archs = new String[] { "amd64", "ia64", "x86"}; + } + boolean loaded = false; + for(int i = 0; i < archs.length; i++) { + try { + System.loadLibrary("NTEventLogAppender." + archs[i]); + loaded = true; + break; + } catch(java.lang.UnsatisfiedLinkError e) { + loaded = false; + } + } + if (!loaded) { + System.loadLibrary("NTEventLogAppender"); + } +} +}