日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

logback--How do I configure an AsyncAppender with code? 转载

發(fā)布時間:2025/4/5 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 logback--How do I configure an AsyncAppender with code? 转载 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

原文地址:https://github.com/tony19/logback-android/issues/54

Please provide an example of how to configure the AsyncAppender with a FileAppender to write to the file in an async way. I am getting many StrictMode policy violations (StrictModeDiskWriteViolation) on every log write to my log file.Thanks.

I verified the following config works in Android 4.2.2 without any exceptions.

<configuration debug="true"><property name="LOG_DIR" value="/data/data/com.example/files" /><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>${LOG_DIR}/log.txt</file><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern></encoder></appender><appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"><appender-ref ref="FILE" /></appender><root level="DEBUG"><appender-ref ref="ASYNC" /></root> </configuration>

Example: Configure by in-memory XML string

package com.example;import java.io.ByteArrayInputStream; import java.io.InputStream;import org.slf4j.LoggerFactory;import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.core.joran.spi.JoranException; import android.app.Activity; import android.os.Bundle; import android.view.Menu;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);configureLogbackByString();org.slf4j.Logger log = LoggerFactory.getLogger(MainActivity.class);log.info("hello world!!");}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu);return true;}@Overrideprotected void onDestroy() {super.onDestroy();// Assume SLF4J is bound to logback-classic in the current environment.// This must be called to properly shutdown AsyncAppender and flush logs// upon application exit.LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();loggerContext.stop();}String LOGBACK_XML ="<configuration debug='true'>" +" <property name='LOG_DIR' value='/data/data/com.example/files' />" +" <appender name='FILE' class='ch.qos.logback.core.FileAppender'>" +" <file>${LOG_DIR}/log.txt</file>" +" <encoder>" +" <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n</pattern>" +" </encoder>" +" </appender>" +" <appender name='ASYNC' class='ch.qos.logback.classic.AsyncAppender'>" +" <appender-ref ref='FILE' />" +" </appender>" +" <root level='DEBUG'>" +" <appender-ref ref='ASYNC' />" +" </root>" +"</configuration>";private void configureLogbackByString() {// reset the default context (which may already have been initialized)// since we want to reconfigure itLoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();lc.reset();JoranConfigurator config = new JoranConfigurator();config.setContext(lc);InputStream stream = new ByteArrayInputStream(LOGBACK_XML.getBytes());try {config.doConfigure(stream);} catch (JoranException e) {e.printStackTrace();}} }

Example: Configure with direct calls into logback

package com.example;import org.slf4j.Logger; import org.slf4j.LoggerFactory;import android.app.Activity; import android.os.Bundle; import android.view.Menu; import ch.qos.logback.classic.AsyncAppender; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.FileAppender; import ch.qos.logback.core.util.StatusPrinter;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);configureLogbackDirectly();org.slf4j.Logger log = LoggerFactory.getLogger(MainActivity.class);log.info("hello world!!");}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu);return true;}@Overrideprotected void onDestroy() {super.onDestroy();// assume SLF4J is bound to logback-classic in the current environmentLoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();loggerContext.stop();}private void configureLogbackDirectly() {// reset the default context (which may already have been initialized)// since we want to reconfigure itLoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();lc.reset();// setup FileAppenderPatternLayoutEncoder encoder1 = new PatternLayoutEncoder();encoder1.setContext(lc);encoder1.setPattern("%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n");encoder1.start();FileAppender<ILoggingEvent> fileAppender = new FileAppender<ILoggingEvent>();fileAppender.setContext(lc);fileAppender.setName("FILE");fileAppender.setFile(this.getFileStreamPath("log.txt").getAbsolutePath());fileAppender.setEncoder(encoder1);fileAppender.start();AsyncAppender asyncAppender = new AsyncAppender();asyncAppender.setContext(lc);asyncAppender.setName("ASYNC");// UNCOMMENT TO TWEAK OPTIONAL SETTINGS // // excluding caller data (used for stack traces) improves appender's performance // asyncAppender.setIncludeCallerData(false); // // set threshold to 0 to disable discarding and keep all events // asyncAppender.setDiscardingThreshold(0); // asyncAppender.setQueueSize(256); asyncAppender.addAppender(fileAppender);asyncAppender.start();// add the newly created appenders to the root logger;// qualify Logger to disambiguate from org.slf4j.Loggerch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);root.addAppender(asyncAppender);StatusPrinter.print(lc);} }

?

轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/4913618.html

總結(jié)

以上是生活随笔為你收集整理的logback--How do I configure an AsyncAppender with code? 转载的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲视频一区二区三区在线观看 | 激情午夜影院 | 中国久久久 | 极品少妇视频 | 欧美激情区 | 激情欧美一区二区三区 | 国产乡下妇女做爰毛片 | 奇米一区二区三区 | 一区二区三区在线免费观看 | 亚洲成人自拍网 | 欧美亚洲在线播放 | 精品久久国产视频 | 激情黄色小视频 | 五月婷婷一区二区三区 | 调教奶奴 | 国产亚洲一区二区三区不卡 | 日韩日日日| 欧美日韩久久久久久 | 四虎激情 | 五月天导航 | 成熟妇人a片免费看网站 | 日本少妇xxxxx | 四虎精品一区 | 成 年 人 黄 色 大 片大 全 | 亚洲色图 一区二区 | 视频国产一区 | 亚洲成人黄色网 | 青青青青青青青青草 | 国产福利av| 精品日韩中文字幕 | 中国在线观看片免费 | 牛人盗摄一区二区三区视频 | 国产主播中文字幕 | 黑丝一区| 一级全黄少妇性色生活片 | 影音先锋成人资源站 | 爱爱一区 | 韩国三级一区 | 亚洲国产精品无码久久久 | 在线免费观看污网站 | 中文字幕天堂av | 蜜桃av噜噜一区二区三区 | 成人 黄 色 免费播放 | 极品美女销魂一区二区三区 | www.天天干| 三级黄色在线播放 | 男女黄色片 | 亚欧美日韩 | 久久精品欧美一区二区三区不卡 | 色欧美视频| av在线播放网| 色狠| 色婷婷av一区二区三区之红樱桃 | 色婷婷色 | 丰满人妻一区二区三区精品高清 | 国产酒店自拍 | 欧美亚洲一二三区 | 久久艹中文字幕 | 老地方在线观看免费动漫 | 入禽太深免费视频 | 魔女鞋交玉足榨精调教 | 实拍澡堂美女洗澡av | 无码人妻精品一区二区蜜桃网站 | 91亚洲欧美激情 | 亚洲av日韩av在线观看 | 免费无码毛片一区二三区 | 久草97| av动漫天堂 | 久久久久五月天 | 东京久久| 亚洲视频黄色 | 天天干天天爽 | 国产91在线亚洲 | 山村大伦淫第1部分阅读小说 | 午夜视频免费在线观看 | 深夜视频一区二区三区 | 日韩av成人在线 | 九九久久九九久久 | 天堂va蜜桃一区 | 秋霞毛片少妇激情免费 | 一本大道东京热无码aⅴ | 天天色影网 | 成人一级影视 | 国产一区二区在线看 | 色综合久久久无码中文字幕波多 | 97色在线| 探花视频在线版播放免费观看 | 欧美男人又粗又长又大 | 久久久999国产精品 天堂av中文在线 | 日韩一区二区不卡 | 羽月希奶水一区二区三区 | 2018国产精品| 日本精品一二三 | 亚洲免费a视频 | 日韩欧美四区 | 婷婷调教口舌奴ⅴk | 男女性网站 | 亚洲日本免费 | 国产福利在线看 |