Android应用程序的自定义日志记录

阿努·古普塔(Anuj Gupta):

我想为Android应用程序创建一个自定义记录器。当应用程序生成大量信息时,日志记录应在单独的线程中完成。我不想使用Android日志,因为我需要以特定格式编写日志。多个线程将同时写入日志文件,因此我使用了一个队列来保存日志消息

这是我的代码

Queue<LogEntry> logQueue = new LinkedBlockingQueue<LogEntry>();
LogWritterThread logWritterThread = new LogWritterThread();

// to queue the log messages
public void QueueLogEntry(String message)
{
    LogEntry le = new LogEntry(message);
    {
        logQueue.add(le);
        logQueue.notifyAll();
    }

logWritterThread.start();
}

    class LogWritterThread extends Thread 
{
    public void run() 
    {
        try 
        {
            while(true)
            {
                //thread waits until there are any logs to write in the queue
                if(logQueue.peek() == null)
                    synchronized(logQueue){
                        logQueue.wait();
                    }
                if(logQueue.peek() != null)
                {
                    LogEntry logEntry;
                    synchronized(logQueue){
                        logEntry = logQueue.poll();
                    }

                    // write the message to file
                }
                if(Thread.interrupted())
                    break;
            }
        } 
        catch (InterruptedException e) 
        {                
        }
    }
}

这段代码有什么问题吗?或创建日志记录队列的更好方法

谢谢,阿努吉

是布伦特:

Java BlockingQueue实现已经内置了同步问题。使用wait,notify和synced是多余的,因此不需要。

尝试模仿BlockingQueue javadoc中提供的Producer / Consumer示例

class LogEntry {
  private final String message;

  LogEntry(String msg) {
    message = msg;
  }
}

class LogProducer {
   private final BlockingQueue<LogEntry> queue;

   LogProducer(BlockingQueue<LogEntry> q) {
     queue = q;
   }

   public void log(String msg) {
      queue.put(new LogEntry(msg));
   }
 }

class LogConsumer implements Runnable {
   private final BlockingQueue<LogEntry> queue;

   LogConsumer(BlockingQueue<LogEntry> q) {
     queue = q;
   }

   public void run() {
     try {
       while(true) {
         LogEntry entry = queue.take();
         // do something with entry
       }
     } catch(InterruptedException ex) {
       // handle
     }
   }
}

class Setup {
  public static void main(String[] args) {
    BlockingQueue<LogEntry> queue = new LinkedBlockingQueue<LogEntry>();
    LogConsumer c = new LogConsumer(queue);
    new Thread(c).start();

    LogProducer p = new LogProducer(queue);
    p.log("asynch");
    p.log("logging");
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

防止在Spring Boot应用程序中针对自定义异常的堆栈跟踪日志记录

从.net Core自定义日志记录到应用程序见解

在Linux上C应用程序的DEBUG模式下执行的自定义日志记录

自定义 Android 应用程序

Android应用程序中SeekBar的自定义形状

自定义相机应用程序崩溃-Android

自定义键盘Android获取当前的应用程序

Android应用程序,动态添加自定义组件

Android应用程序的自定义字体

更新自定义应用程序

在 .net 核心应用程序中使用 Loggerfactory 自定义日志消息

php-fpm访问日志应包含从php应用程序设置的自定义变量

C#-从自定义应用程序读取嵌套的事件日志

自定义日志记录提供程序被Serilog排除

MvvmCross 自定义日志提供程序不从自身记录

PRISM引导程序的自定义日志记录界面

自定义记录器类的性能分析,用于读取Word文档的应用程序

定义后台的自定义应用程序类型

设计自定义android DPC应用程序与Android管理API有何关系?

Apache Storm:自定义日志记录

Airflow 中的自定义日志记录

Python自定义日志记录

自定义例外默认日志记录

自定义Umbraco日志记录

自定义PostSharp日志记录

MapmyIndia 地图徽标在 android 应用程序中的自定义位置

向Android应用程序开发的Ringtonemanager添加自定义铃声有问题吗?

android studio-如何制作两个自定义应用程序类

Android dataBinding-@BindingAdapter自定义应用程序名称空间被忽略