I2P Address: [http://git.idk.i2p]

Skip to content
Snippets Groups Projects
LogWriter.java 5.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • zzz's avatar
    zzz committed
    package net.i2p.util;
    
    /*
     * public domain
     *
     */
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.List;
    
    zzz's avatar
    zzz committed
    import java.util.Queue;
    
    zzz's avatar
    zzz committed
    
    /**
     * bridge to android logging
     *
     * @author zzz
     */
    class LogWriter implements Runnable {
        private final static long CONFIG_READ_ITERVAL = 10 * 1000;
        private long _lastReadConfig = 0;
        private long _numBytesInCurrentFile = 0;
        private OutputStream _currentOut; // = System.out
        private int _rotationNum = -1;
        private String _logFilenamePattern;
        private File _currentFile;
        private LogManager _manager;
    
        private boolean _write;
        
        private LogWriter() { // nop
        }
    
        public LogWriter(LogManager manager) {
            _manager = manager;
        }
    
        public void stopWriting() {
            _write = false;
        }
        
        public void run() {
            _write = true;
            try {
                while (_write) {
                    flushRecords();
                    rereadConfig();
                }
            } catch (Exception e) {
                System.err.println("Error writing the logs: " + e.getMessage());
                e.printStackTrace();
            }
        }
    
        public void flushRecords() { flushRecords(true); }
        public void flushRecords(boolean shouldWait) {
            try {
    
    zzz's avatar
    zzz committed
                // zero copy, drain the manager queue directly
                Queue<LogRecord> records = _manager.getQueue();
    
    zzz's avatar
    zzz committed
                if (records == null) return;
    
    zzz's avatar
    zzz committed
                if (!records.isEmpty()) {
                    LogRecord rec;
                    while ((rec = records.poll()) != null) {
                        writeRecord(rec);
                    }
                    try {
                        if (_currentOut != null)
                            _currentOut.flush();
                    } catch (IOException ioe) {
                        //if (++_diskFullMessageCount < MAX_DISKFULL_MESSAGES)
                            System.err.println("Error writing the router log - disk full? " + ioe);
                    }
    
    zzz's avatar
    zzz committed
                }
            } catch (Throwable t) {
                t.printStackTrace();
            } finally {
                if (shouldWait) {
                    try { 
                        synchronized (this) {
                            this.wait(10*1000); 
                        }
                    } catch (InterruptedException ie) { // nop
                    }
                }
            }
        }
    
    zzz's avatar
    zzz committed
    
        public String currentFile() {
            return _currentFile != null ? _currentFile.getAbsolutePath() : "uninitialized";
        }
    
    zzz's avatar
    zzz committed
        
        private void rereadConfig() {
            long now = Clock.getInstance().now();
            if (now - _lastReadConfig > CONFIG_READ_ITERVAL) {
                _manager.rereadConfig();
                _lastReadConfig = now;
            }
        }
    
        private void writeRecord(LogRecord rec) {
            if (rec.getThrowable() == null)
    
                log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage());
    
    zzz's avatar
    zzz committed
            else
    
                log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage(), rec.getThrowable());
    
    zzz's avatar
    zzz committed
        }
    
    
        public void log(int priority, Class src, String name, String threadName, String msg) {
                if (src != null) {
                    String tag = src.getName();
                    int dot = tag.lastIndexOf(".");
                    if (dot >= 0)
                        tag = tag.substring(dot + 1);
    
    zzz's avatar
    zzz committed
                    android.util.Log.println(toAndroidLevel(priority),
    
                                             tag,
                                             '[' + threadName + "] " + msg);
                } else if (name != null)
    
    zzz's avatar
    zzz committed
                    android.util.Log.println(toAndroidLevel(priority),
                                             name,
    
                                             '[' + threadName + "] " + msg);
    
    zzz's avatar
    zzz committed
                else
                    android.util.Log.println(toAndroidLevel(priority),
                                             threadName, msg);
        }
    
    
        public void log(int priority, Class src, String name, String threadName, String msg, Throwable t) {
                if (src != null) {
                    String tag = src.getName();
                    int dot = tag.lastIndexOf(".");
                    if (dot >= 0)
                        tag = tag.substring(dot + 1);
    
    zzz's avatar
    zzz committed
                    android.util.Log.println(toAndroidLevel(priority),
    
                                             tag,
                                             '[' + threadName + "] " + msg +
                                             ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
                } else if (name != null)
    
    zzz's avatar
    zzz committed
                    android.util.Log.println(toAndroidLevel(priority),
                                             name,
    
                                             '[' + threadName + "] " + msg +
                                             ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
    
    zzz's avatar
    zzz committed
                else
                    android.util.Log.println(toAndroidLevel(priority),
                                             threadName,
                                             msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
        }
    
        private static int toAndroidLevel(int level) {
            switch (level) {
            case Log.DEBUG:
                return android.util.Log.DEBUG;
            case Log.INFO:
                return android.util.Log.INFO;
            case Log.WARN:
                return android.util.Log.WARN;
            case Log.ERROR:
            case Log.CRIT:
            default:
                return android.util.Log.ERROR;
            }
        }
    
        private static final String replace(String pattern, int num) {
            char c[] = pattern.toCharArray();
            StringBuffer buf = new StringBuffer();
            for (int i = 0; i < c.length; i++) {
                if ( (c[i] != '#') && (c[i] != '@') )
                    buf.append(c[i]);
                else
                    buf.append(num);
            }
            return buf.toString();
        }
    }