Log4j 配置

来源:互联网 发布:邓布利多 知乎 编辑:程序博客网 时间:2024/05/17 01:35

配置说明

1.配置文件
Log4j配置文件的基本格式如下:

#Log4j的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可按key=value格式或xml格式来配置信息。通过配置,可以创建出Log4j的运行环境。#配置根Logger#log4j.rootLogger = [Level], appenderName1, appenderName2, ...#配置日志信息输出目的地Appender#log4j.appender.appenderName = fully.qualified.name.of.appender.class #log4j.appender.appenderName.option1 = value1 #...#log4j.appender.appenderName.optionN = valueN #配置日志信息的格式(布局)#log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class #log4j.appender.appenderName.layout.option1 = value1 #...#log4j.appender.appenderName.layout.optionN = valueN #[Level]:日志输出级别,共有5级:#FATAL 0, ERROR 3, WARN 4, INFO 6, DEBUG 7 #[Appender]:日志输出目的地,Log4j提供的appender有以下几种:#org.apache.log4j.ConsoleAppender(控制台),#org.apache.log4j.FileAppender(文件),#org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),#org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),#org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)#还可以自己添加按照时间和大小来分割的appender#[Layout]:日志输出格式,Log4j提供的layout有以下几种:#org.apache.log4j.HTMLLayout(以HTML表格形式布局),#org.apache.log4j.PatternLayout(可以灵活地指定布局模式),#org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),#org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)#[打印参数]:Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:# %m   输出代码中指定的消息# %p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL # %r   输出自应用启动到输出该log信息耗费的毫秒数 # %c   输出所属的类目,通常就是所在类的全名 # %t   输出产生该日志事件的线程名 # %n   输出一个回车换行符,Windows平台为“/r/n”,Unix平台为“/n” # %d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日  22:10:28,921  # %l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10) # %c  category的名称,可使用{n}限制输出的精度。例如:logger名为"a.b.c",%c{2}将输出"b.c"。 # %C  产生log事件的java完全限定类名。可使用{n}限制输出的精度。例如:“org.apache.xyz.SomeClass”,%C{1}将输出“SomeClass”。 # %d  时间和日期的输出格式,例如:%d{yyyy MM dd HH:mm:ss,SS},可不带后面的日期格式字符。 # %F  产生log事件的java源文件名,带“.java”后缀及包名称。 # %l  log发生位置的详细描述,包括方法名、文件名及行号。 # %L  log发生在源文件中的位置。 # %m  log事件的消息内容。 # %M  log发生时所在的方法名称。 # %n  根据所运行的平台输出相应的行分隔字符。 # %p  log事件的级别。 # %r  自程序运行至log事件产生所经过的时间。 # %t  产生log的线程名称。# 可以试试[%d{yyyy-MM-dd.HH:mm:ss.SSS}][%-5p][%C{1}.%M(%L)] - %m%n

附我的例子

log4j.rootLogger                                = DEBUG,file,stdout#文件, 自定义按照日期和大小分割log4j.appender.file                             = com.chenengdai.liquidation.util.log4j.Log4JDateAndSizeSplitlog4j.appender.file.ImmediateFlush              = truelog4j.appender.file.File                        = /data/software/liquidation/liquidation.loglog4j.appender.file.DatePattern                 = '.'yyyyMMdd'.log'log4j.appender.file.Append                      = truelog4j.appender.file.MaxFileSize                 = 10240KBlog4j.appender.file.MaxBackupIndex              = -1log4j.appender.file.layout                      = org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern    = [%d{HH:mm:ss.SSS}][%-5p] %m%n#控制台log4j.appender.stdout                           = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout                    = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern  = [%d{HH:mm:ss.SSS}][%-5p] %m%n#打印sql语句log4j.logger.org.apache=INFOlog4j.logger.java.sql.ResultSet=INFOlog4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUGlog4j.logger.java.sql.PreparedStatement=DEBUG
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>    <appender name="console" class="org.apache.log4j.ConsoleAppender">        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}][%C{1}.%M(%L)]  %m%n" />        </layout>        <filter class="org.apache.log4j.varia.LevelRangeFilter">            <param name="levelMin" value="debug" />            <param name="levelMax" value="warn" />            <param name="AcceptOnMatch" value="true" />        </filter>    </appender>    <appender name="file" class="org.apache.log4j.DailyRollingFileAppender">        <param name="File" value="/opt/tomcat/log/service" />        <param name="Append" value="true" />        <param name="DatePattern" value="'.'yyyyMMdd'.log'" />        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}][%C{1}.%M(%L)]  %m%n" />        </layout>    </appender>    <appender name="file-monitor" class="org.apache.log4j.DailyRollingFileAppender">        <param name="File" value="/opt/tomcat/log/service-monitor" />        <!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->        <param name="Append" value="true" />        <param name="DatePattern" value="'.'yyyyMMdd'.log'" />        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern" value="[%d{HH:mm:ss:SSS}][%C{1}.%M(%L)]  %m%n" />        </layout>    </appender>    <!-- 通过<category></category>的定义可以将各个包中的类日志输出到不同的日志文件中 -->    <category name="mrathena.service.monitor">        <priority value="debug" />        <appender-ref ref="file-monitor" />    </category>    <root>        <priority value="debug" />        <appender-ref ref="console" />        <appender-ref ref="file" />    </root></log4j:configuration>

2.在代码中初始化Logger:
1)在程序中调用BasicConfigurator.configure()方法:给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为”%-4r [%t] %-5p %c %x - %m%n”,还有根记录器的默认级别是Level.DEBUG.
2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;
3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;
4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。

3.为不同的 Appender 设置日志输出级别:
当调试系统时,我们往往注意的只是异常级别的日志输出,但是通常所有级别的输出都是放在一个文件里的,如果日志输出的级别是BUG!?那就慢慢去找吧。
这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改Appender的Threshold 就能实现,比如下面的例子:

 ### set log levels ###log4j.rootLogger = debug ,  stdout ,  D ,  E### 输出到控制台 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n### 输出到日志文件 ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = logs/log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n### 保存异常信息到单独文件 ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = logs/error.log ## 异常日志文件名log4j.appender.D.Append = truelog4j.appender.D.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
public class TestLog4j {    public static void main(String[] args) {        PropertyConfigurator.configure("D:/Code/conf/log4j.properties");        Logger logger = Logger.getLogger(TestLog4j.class);        logger.debug("debug");        logger.error("error");    } }

转载自:配置Log4j(很详细)(http://blog.csdn.net/azheng270/article/details/2173430), 里面还有其他内容


资源:按照日期和大小分割日志文件, 共2个类, 1个配置, 使用时要注意要修改包名和配置文件

1.Log4JDateAndSizeSplit.java

/** * Project Name:hao24-common * File Name:Log4JDateAndSizeSplit.java * Package Name:cn.hao24.util.spring * Date:2016年3月31日上午11:30:22 * Copyright (c) 2016, lujie All Rights Reserved. **/package com.chenengdai.liquidation.util.log4j;/** * ClassName:Log4JDateAndSizeSplit :log4j日志支持按照日期和大小进行切割<br/> * Date:     2016年3月31日 上午11:30:22 <br/> * @author   lujie * @version  * @see      */import java.io.File;import java.io.IOException;import java.io.Writer;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import java.util.TimeZone;import org.apache.log4j.FileAppender;import org.apache.log4j.Layout;import org.apache.log4j.helpers.CountingQuietWriter;import org.apache.log4j.helpers.LogLog;import org.apache.log4j.helpers.OptionConverter;import org.apache.log4j.spi.LoggingEvent;/** * * ClassName: Log4JDateAndSizeSplit <br/> * Function: Log4j生成日志类重写,该类可以按照日期+指定大小分隔日志. <br/> * date: 2016年3月31日 下午12:44:14 <br/> * @author lujie * @version */public class Log4JDateAndSizeSplit extends FileAppender {    // The code assumes that the following constants are in a increasing sequence.    public static final int TOP_OF_TROUBLE = -1;    public static final int TOP_OF_MINUTE = 0;    public static final int TOP_OF_HOUR = 1;    public static final int HALF_DAY = 2;    public static final int TOP_OF_DAY = 3;    public static final int TOP_OF_WEEK = 4;    public static final int TOP_OF_MONTH = 5;    /**     * The default maximum file size is 10MB.     */    protected long maxFileSize = 10 * 1024 * 1024;    /**     * There is one backup file by default.     */    protected int maxBackupIndex = 1;    /**     * meaning daily rollover.     */    private String datePattern = "'.'yyyy-MM-dd";    /**     * "scheduledFilename" at the beginning of the next hour.     *      */    private String scheduledFilename;    /**     * The next time we estimate a rollover should occur.     */    private long nextCheck = System.currentTimeMillis() - 1;    Date now = new Date();    SimpleDateFormat sdf;    RollingCalendar rc = new RollingCalendar();    int checkPeriod = TOP_OF_TROUBLE;    // The gmtTimeZone is used only in computeCheckPeriod() method.    static final TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");    /**     * The default constructor does nothing.     */    public Log4JDateAndSizeSplit() {}    /**     * ouput destination for this appender.     */    public Log4JDateAndSizeSplit(Layout layout, String filename, String datePattern) throws IOException {        super(layout, filename, true);        this.datePattern = datePattern;        activateOptions();    }    /**     * being rolled over to backup files.     *      * @since 1.1     */    public long getMaximumFileSize() {        return maxFileSize;    }    /**     * being rolled over to backup files.     *      * <p>     * JavaBeans {@link java.beans.Introspector Introspector}.     *      * @see #setMaxFileSize(String)     */    public void setMaximumFileSize(long maxFileSize) {        this.maxFileSize = maxFileSize;    }    /**     * being rolled over to backup files.     *      * <p>     * the value "10KB" will be interpreted as 10240.     */    public void setMaxFileSize(String value) {        maxFileSize = OptionConverter.toFileSize(value, maxFileSize + 1);    }    /**     * Returns the value of the <b>MaxBackupIndex</b> option.     */    public int getMaxBackupIndex() {        return maxBackupIndex;    }    /**     * Set the maximum number of backup files to keep around.     *      * <p>     */    public void setMaxBackupIndex(int maxBackups) {        this.maxBackupIndex = maxBackups;    }    /**     */    public void setDatePattern(String pattern) {        datePattern = pattern;    }    /** Returns the value of the <b>DatePattern</b> option. */    public String getDatePattern() {        return datePattern;    }    @Override    public void activateOptions() {        super.activateOptions();        if (datePattern != null && fileName != null) {            now.setTime(System.currentTimeMillis());            sdf = new SimpleDateFormat(datePattern);            int type = computeCheckPeriod();            printPeriodicity(type);            rc.setType(type);            File file = new File(fileName);            scheduledFilename = fileName + sdf.format(new Date(file.lastModified()));        } else {            LogLog.error("Either File or DatePattern options are not set for appender [" + name + "].");        }    }    void printPeriodicity(int type) {        switch (type) {            case TOP_OF_MINUTE:                LogLog.debug("Appender [" + name + "] to be rolled every minute.");                break;            case TOP_OF_HOUR:                LogLog.debug("Appender [" + name + "] to be rolled on top of every hour.");                break;            case HALF_DAY:                LogLog.debug("Appender [" + name + "] to be rolled at midday and midnight.");                break;            case TOP_OF_DAY:                LogLog.debug("Appender [" + name + "] to be rolled at midnight.");                break;            case TOP_OF_WEEK:                LogLog.debug("Appender [" + name + "] to be rolled at start of week.");                break;            case TOP_OF_MONTH:                LogLog.debug("Appender [" + name + "] to be rolled at start of every month.");                break;            default:                LogLog.warn("Unknown periodicity for appender [" + name + "].");        }    }    // This method computes the roll over period by looping over the    // periods, starting with the shortest, and stopping when the r0 is    // different from from r1, where r0 is the epoch formatted according    // the datePattern (supplied by the user) and r1 is the    // epoch+nextMillis(i) formatted according to datePattern. All date    // formatting is done in GMT and not local format because the test    // logic is based on comparisons relative to 1970-01-01 00:00:00    // GMT (the epoch).    int computeCheckPeriod() {        RollingCalendar rollingCalendar = new RollingCalendar(gmtTimeZone, Locale.ENGLISH);        // set sate to 1970-01-01 00:00:00 GMT        Date epoch = new Date(0);        if (datePattern != null) {            for (int i = TOP_OF_MINUTE; i <= TOP_OF_MONTH; i++) {                SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePattern);                simpleDateFormat.setTimeZone(gmtTimeZone); // do all date                                                            // formatting in GMT                String r0 = simpleDateFormat.format(epoch);                rollingCalendar.setType(i);                Date next = new Date(rollingCalendar.getNextCheckMillis(epoch));                String r1 = simpleDateFormat.format(next);                // System.out.println("Type = "+i+", r0 = "+r0+", r1 = "+r1);                if (r0 != null && r1 != null && !r0.equals(r1)) {                    return i;                }            }        }        return TOP_OF_TROUBLE; // Deliberately head for trouble...    }    /**     * Implements the usual roll over behaviour.     *      * <p>     * If <code>MaxBackupIndex</code> is positive, then files {     *      * <p>     * If <code>MaxBackupIndex</code> is equal to zero, then the     * <code>File</code> is truncated with no backup files created.     */    public // synchronization not necessary since doAppend is alreasy synched    void sizeRollOver() {        File target;        File file;        LogLog.debug("rolling over count=" + ((CountingQuietWriter) qw).getCount());        LogLog.debug("maxBackupIndex=" + maxBackupIndex);        String datedFilename = fileName + sdf.format(now);        if (maxBackupIndex > 0) {            // Delete the oldest file, to keep Windows happy.            file = new File(datedFilename + '.' + maxBackupIndex);            if (file.exists())                file.delete();            // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3,            // 2}            for (int i = maxBackupIndex - 1; i >= 1; i--) {                file = new File(datedFilename + "." + i);                if (file.exists()) {                    target = new File(datedFilename + '.' + (i + 1));                    LogLog.debug("Renaming file " + file + " to " + target);                    file.renameTo(target);                }            }            // Rename fileName to datedFilename.1            target = new File(datedFilename + "." + 1);            this.closeFile(); // keep windows happy.            file = new File(fileName);            LogLog.debug("Renaming file " + file + " to " + target);            file.renameTo(target);        } else if (maxBackupIndex < 0) { // infinite number of files                                            // find the max backup index            for (int i = 1; i < Integer.MAX_VALUE; i++) {                target = new File(datedFilename + "." + i);                if (!target.exists()) { // Rename fileName to datedFilename.i                    this.closeFile();                    file = new File(fileName);                    file.renameTo(target);                    LogLog.debug("Renaming file " + file + " to " + target);                    break;                }            }        }        try {            // This will also close the file. This is OK since multiple            // close operations are safe.            this.setFile(fileName, false, bufferedIO, bufferSize);        } catch (IOException e) {            LogLog.error("setFile(" + fileName + ", false) call failed.", e);        }        scheduledFilename = datedFilename;    }    @Override    public synchronized void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize) throws IOException {        super.setFile(fileName, append, this.bufferedIO, this.bufferSize);        if (append) {            File f = new File(fileName);            ((CountingQuietWriter) qw).setCount(f.length());        }    }    @Override    protected void setQWForFiles(Writer writer) {        this.qw = new CountingQuietWriter(writer, errorHandler);    }    /**     * Rollover the current file to a new file.     */    void timeRollOver() throws IOException {        /* Compute filename, but only if datePattern is specified */        if (datePattern == null) {            errorHandler.error("Missing DatePattern option in rollOver().");            return;        }        String datedFilename = fileName + sdf.format(now);        // It is too early to roll over because we are still within the        // bounds of the current interval. Rollover will occur once the        // next interval is reached.        if (scheduledFilename.equals(datedFilename)) {            return;        }        // close current file, and rename it to datedFilename        this.closeFile();        File target = new File(scheduledFilename);        if (target.exists()) {            target.delete();        }        File file = new File(fileName);        boolean result = file.renameTo(target);        if (result) {            LogLog.debug(fileName + " -> " + scheduledFilename);        } else {            LogLog.error("Failed to rename [" + fileName + "] to [" + scheduledFilename + "].");        }        try {            // This will also close the file. This is OK since multiple            // close operations are safe.            super.setFile(fileName, false, this.bufferedIO, this.bufferSize);        } catch (IOException e) {            errorHandler.error("setFile(" + fileName + ", false) call failed.");        }        scheduledFilename = datedFilename;    }    /**     *      * <p>     * rollover.     * */    @Override    protected void subAppend(LoggingEvent event) {        long n = System.currentTimeMillis();        if (n >= nextCheck) {            now.setTime(n);            nextCheck = rc.getNextCheckMillis(now);            try {                timeRollOver();            } catch (IOException ioe) {                LogLog.error("rollOver() failed.", ioe);            }        } else if ((fileName != null) && ((CountingQuietWriter) qw).getCount() >= maxFileSize) {            sizeRollOver();        }        super.subAppend(event);    }}

2.RollingCalendar.java

package com.chenengdai.liquidation.util.log4j;/** * Project Name:hao24-common * File Name:RollingCalendar.java * Package Name:cn.hao24.util.spring * Date:2016年3月31日上午11:41:34 * Copyright (c) 2016, lujie@hao24.cn All Rights Reserved. **/import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.Locale;import java.util.TimeZone;/** * ClassName:RollingCalendar <br/> * Date:     2016年3月31日 上午11:41:34 <br/> * @author   lujie * @version  * @see      */class RollingCalendar extends GregorianCalendar {    private static final long serialVersionUID = -3560331770601814177L;    int type = Log4JDateAndSizeSplit.TOP_OF_TROUBLE;    RollingCalendar() {        super();    }    RollingCalendar(TimeZone tz, Locale locale) {        super(tz, locale);    }    void setType(int type) {        this.type = type;    }    public long getNextCheckMillis(Date now) {        return getNextCheckDate(now).getTime();    }    public Date getNextCheckDate(Date now) {        this.setTime(now);        switch (type) {            case Log4JDateAndSizeSplit.TOP_OF_MINUTE:                this.set(Calendar.SECOND, 0);                this.set(Calendar.MILLISECOND, 0);                this.add(Calendar.MINUTE, 1);                break;            case Log4JDateAndSizeSplit.TOP_OF_HOUR:                this.set(Calendar.MINUTE, 0);                this.set(Calendar.SECOND, 0);                this.set(Calendar.MILLISECOND, 0);                this.add(Calendar.HOUR_OF_DAY, 1);                break;            case Log4JDateAndSizeSplit.HALF_DAY:                this.set(Calendar.MINUTE, 0);                this.set(Calendar.SECOND, 0);                this.set(Calendar.MILLISECOND, 0);                int hour = get(Calendar.HOUR_OF_DAY);                if (hour < 12) {                    this.set(Calendar.HOUR_OF_DAY, 12);                } else {                    this.set(Calendar.HOUR_OF_DAY, 0);                    this.add(Calendar.DAY_OF_MONTH, 1);                }                break;            case Log4JDateAndSizeSplit.TOP_OF_DAY:                this.set(Calendar.HOUR_OF_DAY, 0);                this.set(Calendar.MINUTE, 0);                this.set(Calendar.SECOND, 0);                this.set(Calendar.MILLISECOND, 0);                this.add(Calendar.DATE, 1);                break;            case Log4JDateAndSizeSplit.TOP_OF_WEEK:                this.set(Calendar.DAY_OF_WEEK, getFirstDayOfWeek());                this.set(Calendar.HOUR_OF_DAY, 0);                this.set(Calendar.MINUTE, 0);                this.set(Calendar.SECOND, 0);                this.set(Calendar.MILLISECOND, 0);                this.add(Calendar.WEEK_OF_YEAR, 1);                break;            case Log4JDateAndSizeSplit.TOP_OF_MONTH:                this.set(Calendar.DATE, 1);                this.set(Calendar.HOUR_OF_DAY, 0);                this.set(Calendar.MINUTE, 0);                this.set(Calendar.SECOND, 0);                this.set(Calendar.MILLISECOND, 0);                this.add(Calendar.MONTH, 1);                break;            default:                throw new IllegalStateException("Unknown periodicity type.");        }        return getTime();    }}

3.配置文件

log4j.appender.file                             = com.chenengdai.liquidation.util.log4j.Log4JDateAndSizeSplitlog4j.appender.file.ImmediateFlush              = truelog4j.appender.file.File                        = /data/software/liquidation/liquidation.loglog4j.appender.file.DatePattern                 = '.'yyyyMMdd'.log'log4j.appender.file.Append                      = truelog4j.appender.file.MaxFileSize                 = 10240KBlog4j.appender.file.MaxBackupIndex              = -1log4j.appender.file.layout                      = org.apache.log4j.PatternLayoutlog4j.appender.file.layout.ConversionPattern    = [%d{HH:mm:ss.SSS}][%-5p] %m%n#不确定这个要不要填log4j.appender.R.Threshold                      = INFO
1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 修冰箱没几个月又坏了怎么办 星露谷物语活动中心成了仓库怎么办 你家如果油锅起火时应该怎么办 当你遇到电器起火时应该怎么办 酷派大神f2充不进去电怎么办 借车子别人开违章一年了怎么办 快递刚发货我点错了收货怎么办 快递收货地址错了已经发货了怎么办 老公在外地工地上夜班吃不好怎么办 工人在工地干活被吊车撞了怎么办 小米手机记不得保密柜密码怎么办 华为手机文件保密柜密码忘了怎么办 超市寄存柜密码纸丢了怎么办 佳明软件安装不到手机上怎么办 最好的朋友的抢了自己的活怎么办 支付宝被实名验证上限了怎么办 装修预留插座被挡了一半怎么办 衣服放在柜子里面有味道怎么办 河北发货一个柜到天津港口怎么办 家用潜水泵更换电容后压力小怎么办 无塔供水井水水位低了怎么办 应急部成立林场的专业灭火队怎么办 路由器我恢复出厂设置断网了怎么办 多囊卵巢综合症不来月经怎么办 天刀普通血战苍梧城没有太白怎么办 天涯明月刀把沈妄言打入水中怎么办 天涯明月刀刷本队友技能太花怎么办 手机收所有短信时显示被隐藏怎么办 div放图片多出的空白怎么办 我14岁射精让我记忆力差了怎么办 qq闪退聊天记录全没了怎么办 木瓜奇迹忘记升级过头转职了怎么办 孩子进入青春期什么坏事都干怎么办 母狗狗第一次来月经应该怎么办图 社保断了想补缴怎么办?这些要知道 换工作社保断了一个月怎么办 北京社保中间断了几个月怎么办 农保和社保都交了医保怎么办 如果交了社保结婚生孩子断了怎么办 南京社保中间断了几个月怎么办 mu大师等级技能点加点太慢怎么办