精华内容
下载资源
问答
  • Linux系统的文件类型大致可分为三类: 普通文件, 目录文件和伪文件. 伪文件不是用来存储数据, 因此这些文件不占用磁盘空间, 只是存在于内存中. /proc 让你可以与内核内部数据进行交互, 获取有关进程有用信息. ...
  • Log4J日志配置详解 一、Log4j简介 ...综合使用这三个组件可以轻松地记录信息类型和级别,并可以在运行时控制日志输出的样式和位置。 1、Loggers Loggers组件在此系统中被分为五个级别

    Log4J日志配置详解

    一、Log4j简介

    Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。

    1、Loggers

    Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,

    DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。


    2、Appenders

    禁用和使用日志请求只是Log4j的基本功能,Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。

    常使用的类如下:

    org.apache.log4j.ConsoleAppender(控制台)
    org.apache.log4j.FileAppender(文件)
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    配置模式:
    log4j.appender.appenderName = className
    log4j.appender.appenderName.Option1 = value1

    log4j.appender.appenderName.OptionN = valueN

    3、Layouts

    有时用户希望根据自己的喜好格式化自己的日志输出,Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。

    常使用的类如下:

    org.apache.log4j.HTMLLayout(以HTML表格形式布局)
    org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
    org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)

    配置模式:

    log4j.appender.appenderName.layout =className
    log4j.appender.appenderName.layout.Option1 = value1

    log4j.appender.appenderName.layout.OptionN = valueN

     

    二、配置详解

    在实际应用中,要使Log4j在系统中运行须事先设定配置文件。配置文件事实上也就是对Logger、Appender及Layout进行相应设定。Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties属性文件。下面以properties属性文件为例介绍log4j.properties的配置。

    1、配置根Logger:
    log4j.rootLogger = [ level ] , appenderName1, appenderName2, …
    log4j.additivity.org.apache=false:表示Logger不会在父Logger的appender里输出,默认为true。
    level :设定日志记录的最低级别,可设的值有OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的级别,Log4j建议只使用中间四个级别。通过在这里设定级别,您可以控制应用程序中相应级别的日志信息的开关,比如在这里设定了INFO级别,则应用程序中所有DEBUG级别的日志信息将不会被打印出来。
    appenderName:就是指定日志信息要输出到哪里。可以同时指定多个输出目的地,用逗号隔开。
    例如:log4j.rootLogger=INFO,A1,B2,C3

    2、配置日志信息输出目的地(appender):
    log4j.appender.appenderName = className
    appenderName:自定义appderName,在log4j.rootLogger设置中使用;
    className:可设值如下:
    (1)org.apache.log4j.ConsoleAppender(控制台)
    (2)org.apache.log4j.FileAppender(文件)
    (3)org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    (4)org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    (5)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
    (1)ConsoleAppender选项:
    Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
    ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
    Target=System.err:默认值是System.out。
    (2)FileAppender选项:
    Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
    ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
    Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
    File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
    (3)DailyRollingFileAppender选项:
    Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
    ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
    Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
    File=D:/logs/logging.log4j:指定当前消息输出到logging.log4j文件中。
    DatePattern='.'yyyy-MM:每月滚动一次日志文件,即每月产生一个新的日志文件。当前月的日志文件名为logging.log4j,前一个月的日志文件名为logging.log4j.yyyy-MM。
    另外,也可以指定按周、天、时、分等来滚动日志文件,对应的格式如下:
    1)'.'yyyy-MM:每月
    2)'.'yyyy-ww:每周
    3)'.'yyyy-MM-dd:每天
    4)'.'yyyy-MM-dd-a:每天两次
    5)'.'yyyy-MM-dd-HH:每小时
    6)'.'yyyy-MM-dd-HH-mm:每分钟
    (4)RollingFileAppender选项:
    Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。
    ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。
    Append=false:true表示消息增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。
    File=D:/logs/logging.log4j:指定消息输出到logging.log4j文件中。
    MaxFileSize=100KB:后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。
    MaxBackupIndex=2:指定可以产生的滚动文件的最大数,例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。

    3、配置日志信息的输出格式(Layout):
    log4j.appender.appenderName.layout=className
    className:可设值如下:
    (1)org.apache.log4j.HTMLLayout(以HTML表格形式布局)
    (2)org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
    (3)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
    (4)org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
    (1)HTMLLayout选项:
    LocationInfo=true:输出java文件名称和行号,默认值是false。
    Title=My Logging: 默认值是Log4J Log Messages。
    (2)PatternLayout选项:
    ConversionPattern=%m%n:设定以怎样的格式显示消息。

    格式化符号说明:

    %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
    %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
    %r:输出自应用程序启动到输出该log信息耗费的毫秒数。
    %t:输出产生该日志事件的线程名。
    %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
    %c:输出日志信息所属的类目,通常就是所在类的全名。
    %M:输出产生日志信息的方法名。
    %F:输出日志消息产生时所在的文件名称。
    %L::输出代码中的行号。
    %m::输出代码中指定的具体日志信息。
    %n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。
    %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
    %%:输出一个"%"字符。
    另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
    1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
    2)%-20c:"-"号表示左对齐。
    3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

     

    附:Log4j比较全面的配置

    Log4j配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。
    log4j.rootLogger=DEBUG,console,dailyFile,im
    log4j.additivity.org.apache=true
    # 控制台(console)
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.Threshold=DEBUG
    log4j.appender.console.ImmediateFlush=true
    log4j.appender.console.Target=System.err
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

    # 日志文件(logFile)
    log4j.appender.logFile=org.apache.log4j.FileAppender
    log4j.appender.logFile.Threshold=DEBUG
    log4j.appender.logFile.ImmediateFlush=true
    log4j.appender.logFile.Append=true
    log4j.appender.logFile.File=D:/logs/log.log4j
    log4j.appender.logFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.logFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 回滚文件(rollingFile)
    log4j.appender.rollingFile=org.apache.log4j.RollingFileAppender
    log4j.appender.rollingFile.Threshold=DEBUG
    log4j.appender.rollingFile.ImmediateFlush=true
    log4j.appender.rollingFile.Append=true
    log4j.appender.rollingFile.File=D:/logs/log.log4j
    log4j.appender.rollingFile.MaxFileSize=200KB
    log4j.appender.rollingFile.MaxBackupIndex=50
    log4j.appender.rollingFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.rollingFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 定期回滚日志文件(dailyFile)
    log4j.appender.dailyFile=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.dailyFile.Threshold=DEBUG
    log4j.appender.dailyFile.ImmediateFlush=true
    log4j.appender.dailyFile.Append=true
    log4j.appender.dailyFile.File=D:/logs/log.log4j
    log4j.appender.dailyFile.DatePattern='.'yyyy-MM-dd
    log4j.appender.dailyFile.layout=org.apache.log4j.PatternLayout
    log4j.appender.dailyFile.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 应用于socket
    log4j.appender.socket=org.apache.log4j.RollingFileAppender
    log4j.appender.socket.RemoteHost=localhost
    log4j.appender.socket.Port=5001
    log4j.appender.socket.LocationInfo=true
    # Set up for Log Factor 5
    log4j.appender.socket.layout=org.apache.log4j.PatternLayout
    log4j.appender.socket.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # Log Factor 5 Appender
    log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
    log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
    # 发送日志到指定邮件
    log4j.appender.mail=org.apache.log4j.net.SMTPAppender
    log4j.appender.mail.Threshold=FATAL
    log4j.appender.mail.BufferSize=10
    log4j.appender.mail.From = xxx@mail.com
    log4j.appender.mail.SMTPHost=mail.com
    log4j.appender.mail.Subject=Log4J Message
    log4j.appender.mail.To= xxx@mail.com
    log4j.appender.mail.layout=org.apache.log4j.PatternLayout
    log4j.appender.mail.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
    # 应用于数据库
    log4j.appender.database=org.apache.log4j.jdbc.JDBCAppender
    log4j.appender.database.URL=jdbc:mysql://localhost:3306/test
    log4j.appender.database.driver=com.mysql.jdbc.Driver
    log4j.appender.database.user=root
    log4j.appender.database.password=
    log4j.appender.database.sql=INSERT INTO LOG4J (Message) VALUES('=[%-5p] %d(%r) --> [%t] %l: %m %x %n')
    log4j.appender.database.layout=org.apache.log4j.PatternLayout
    log4j.appender.database.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n

    # 自定义Appender
    log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
    log4j.appender.im.host = mail.cybercorlin.net
    log4j.appender.im.username = username
    log4j.appender.im.password = password
    log4j.appender.im.recipient = corlin@cybercorlin.net
    log4j.appender.im.layout=org.apache.log4j.PatternLayout
    log4j.appender.im.layout.ConversionPattern=[%-5p] %d(%r) --> [%t] %l: %m %x %n
     

    log4j的强大功能无可置疑,但实际应用中免不了遇到某个功能需要输出独立的日志文件的情况,怎样才能把所需的内容从原有日志中分离,形成单独的日志文件呢?其实只要在现有的log4j基础上稍加配置即可轻松实现这一功能。

     

    先看一个常见的log4j.properties文件,它是在控制台和myweb.log文件中记录日志:

    log4j.rootLogger=DEBUG, stdout, logfile

     

    log4j.category.org.springframework=ERROR

    log4j.category.org.apache=INFO

     

    log4j.appender.stdout=org.apache.log4j.ConsoleAppender

    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

    log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

     

    log4j.appender.logfile=org.apache.log4j.RollingFileAppender

    log4j.appender.logfile.File=${myweb.root}/WEB-INF/log/myweb.log

    log4j.appender.logfile.MaxFileSize=512KB

    log4j.appender.logfile.MaxBackupIndex=5

    log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

    log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

      

    如果想对不同的类输出不同的文件(以cn.com.Test为例),先要在Test.java中定义:

    private static Log logger = LogFactory.getLog(Test.class);

      然后在log4j.properties中加入:

    log4j.logger.cn.com.Test= DEBUG, test

    log4j.appender.test=org.apache.log4j.FileAppender

    log4j.appender.test.File=${myweb.root}/WEB-INF/log/test.log

    log4j.appender.test.layout=org.apache.log4j.PatternLayout

    log4j.appender.test.layout.ConversionPattern=%d %p [%c] - %m%n

      也就是让cn.com.Test中的logger使用log4j.appender.test所做的配置。

     

      但是,如果在同一类中需要输出多个日志文件呢?其实道理是一样的,先在Test.java中定义:

    private static Log logger1 = LogFactory.getLog("myTest1");

    private static Log logger2 = LogFactory.getLog("myTest2");

      然后在log4j.properties中加入:

    log4j.logger.myTest1= DEBUG, test1

    log4j.appender.test1=org.apache.log4j.FileAppender

    log4j.appender.test1.File=${myweb.root}/WEB-INF/log/test1.log

    log4j.appender.test1.layout=org.apache.log4j.PatternLayout

    log4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%n

      

    log4j.logger.myTest2= DEBUG, test2

    log4j.appender.test2=org.apache.log4j.FileAppender

    log4j.appender.test2.File=${myweb.root}/WEB-INF/log/test2.log

    log4j.appender.test2.layout=org.apache.log4j.PatternLayout

    log4j.appender.test2.layout.ConversionPattern=%d %p [%c] - %m%n

      也就是在用logger时给它一个自定义的名字(如这里的"myTest1"),然后在log4j.properties中做出相应配置即可。别忘了不同日志要使用不同的logger(如输出到test1.log的要用logger1.info("abc"))。

     

      还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?别急,这里有个开关:

    log4j.additivity.myTest1 = false

      它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方啦!注意这里的"myTest1"是你在程序中给logger起的那个自定义的名字!

    如果你说,我只是不想同时输出这个日志到log4j.rootLogger所配置的logfile中,stdout里我还想同时输出呢!那也好办,把你的log4j.logger.myTest1 = DEBUG, test1改为下式就OK啦!

    log4j.logger.myTest1=DEBUG, test1

     

    下面是文件上传时记录文件类型的log日志,并输出到指定文件的配置

    复制代码
     1 log4j.rootLogger=INFO, stdout
     2 ######################### logger ##############################
     3 
     4 log4j.appender.stdout = org.apache.log4j.ConsoleAppender
     5 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
     6 log4j.appender.stdout.layout.conversionPattern = %d [%t] %-5p %c - %m%n
     7 log4j.logger.extProfile=INFO, extProfile#日志级别是INFO,标签是extProfile
     8 log4j.additivity.extProfile=false;#输出到指定文件extProfile.log中
     9 
    10 #userProfile log\uff08\u8bb0\u5f55\u4fee\u6539\u5bc6\u7801\uff0c\u627e\u56de\u5bc6\u7801\uff0c\u4fee\u6539\u90ae\u7bb1\uff0c\u4fee\u6539\u624b\u673a\u53f7\uff09
    11 log4j.appender.extProfile=org.apache.log4j.RollingFileAppender
    12 log4j.appender.extProfile.File=logs/extProfile.log#输出到resin根目录的logs文件夹,log4j会自动生成目录和文件
    13 log4j.appender.extProfile.MaxFileSize=20480KB#超过20M就重新创建一个文件
    14 log4j.appender.extProfile.MaxBackupIndex=10
    15 log4j.appender.extProfile.layout=org.apache.log4j.PatternLayout
    16 log4j.appender.extProfile.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
    复制代码

    Java端控制代码

    复制代码
    <%@page contentType="text/html" session="false" pageEncoding="UTF-8"%><%@page
    ...
    org.apache.commons.logging.Log,
    org.apache.commons.logging.LogFactory
    "%>
    ...
    Log extProfile  = LogFactory.getLog("extProfile");
    ...
    if (!item.isFormField()) {
           String fileExt = StringUtils.substringAfterLast(item.getName(), ".").toLowerCase();
           extProfile.info("upfile type is : [ "+fileExt +" ]");
    }
    复制代码

    参考:
    http://www.cnblogs.com/ITEagle/archive/2010/04/23/1718365.html

    http://blog.csdn.net/anlina_1984/article/details/5313023

    展开全文
  • log4j简介 ...综合使用这三个组件可以轻松地记录信息类型和级别,并可以在运行时控制日志输出的样式和位置。 loggersLoggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个

    1、log4j简介

    Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局)。这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出。综合使用这三个组件可以轻松地记录信息的类型和级别,并可以在运行时控制日志输出的样式和位置。

    • loggers

      Loggers组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,分别用来指定这条日志信息的重要程度,明白这一点很重要,Log4j有一个规则:只输出级别不低于设定级别的日志信息,假设Loggers级别设定为INFO,则INFO、WARN、ERROR和FATAL级别的日志信息都会输出,而级别比INFO低的DEBUG则不会输出。

    • Appenders

    禁用和使用日志请求只是Log4j的基本功能,Log4j日志系统还提供许多强大的功能,比如允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等,可以根据天数或者文件大小产生新的文件,可以以流的形式发送到其它地方等等。

    常使用的类如下:

    org.apache.log4j.ConsoleAppender(控制台)
    org.apache.log4j.FileAppender(文件)
    org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
    org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
    org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

    配置模式:
    log4j.appender.appenderName = className
    log4j.appender.appenderName.Option1 = value1

    log4j.appender.appenderName.OptionN = valueN

    2、 Maven引入

       <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.16</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.6.3</version>
        </dependency>

    3、详细配置
    日志文件:log4j.properties

    log4j.rootLogger=DEBUG,console
    log4j.logger.test  =DEBUG,test
    log4j.logger.test1  =DEBUG,test1
    
    
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.threshold=INFO
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
    
    
    log4j.appender.test=org.apache.log4j.RollingFileAppender
    log4j.appender.test.Append=true
    log4j.appender.test.File=./td-test/test.log
    log4j.appender.test.Threshold=INFO
    log4j.appender.test.layout=org.apache.log4j.PatternLayout
    log4j.appender.test.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
    log4j.appender.test.MaxFileSize=10MB
    log4j.appender.test.file.MaxBackupIndex=3
    log4j.appender.test.File.Encoding = UTF-8
    
    
    log4j.appender.test1=org.apache.log4j.RollingFileAppender
    log4j.appender.test1.Append=true
    log4j.appender.test1.File=./td-test/test1.log
    log4j.appender.test1.Threshold=INFO
    log4j.appender.test1.layout=org.apache.log4j.PatternLayout
    log4j.appender.test1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
    log4j.appender.test1.MaxFileSize=10MB
    log4j.appender.test1.file.MaxBackupIndex=3
    log4j.appender.test1.File.Encoding = UTF-8
    
    
    
    
    
    

    4、测试使用

    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * User:    ysl
     * Date:   2016/10/21
     * Time:   18:18
     */
    public class Test {
    
        private static final Logger logger1 = LoggerFactory.getLogger("test");
        private static final Logger logger2 = LoggerFactory.getLogger("test1");
    
    
        public static void main(String[] args )
        {
            logger1.info("@@@@@@@@@@@@@@@");
            logger2.info("#######################");
    
        }
    }

    5、总结
    对于不同类,输出日志到不同的文件,有时候会有这种需求。一方面避免了所有的日志文件都输出到一个文件中导致日志文件过大,不易寻找要寻找的内容。另一方面也可以通过这种方式使得有些日志能够被收集起来,加以统计分析。

    展开全文
  • 的主要作用是方便开发,供IDE 和各种开发工具使用,对代码运行不产生影响,运行时会过滤类型信息。 主要优点如下: 1、易于理解代码 指定函数输入和输出,便于理解代码片段的过程。永远记住你阅读的代码,比你写...

    众所周知,Python 是动态类型语言,运行时不需要指定变量类型。这一点是不会改变的,但是2015年9月创始人 Guido van Rossum 在 Python 3.5 引入了一个类型系统,允许开发者指定变量类型–类型提示(Type Hints)。它的主要作用是方便开发,供IDE 和各种开发工具使用,对代码运行不产生影响,运行时会过滤类型信息。

    主要优点如下:

    1、易于理解代码
    指定函数输入和输出,便于理解代码片段的过程。永远记住你阅读的代码,比你写的代码要多得多。
    有了类型提示(Type Hints),在调用函数时就可以告诉你需要传递哪些参数类型;以及需要扩展/修改函数时,也会告诉你输入和输出所需要的数据类型。 例如,想象一下以下这个发送请求的函数,

    def send_request(request_data : Any,
                     headers: Optional[Dict[str, str]],
                     user_id: Optional[UserId] = None,
                     as_json: bool = True):
        ...
    

    只看这个函数签名,我们就可以知道:

    • request_data可以是任何数据
    • header的内容是一个可选的字符串字典
    • UserId是可选的(默认为None),或者是符合编码UserId的任何数据
    • as_json需要始终是一个布尔值(本质上是一个flag,即使名称可能没有提供这种提示)

    而类型提示系统可以将类型信息从文档中移动到更加接近函数的接口,然后以一个明确定义的方式来声明复杂的类型要求。同时,构建linters,并在每次更改代码后运行它们,可以检查这些类型提示约束,确保它们永远不会过时。

    2、 易于重构
    类型提示可以在重构时,更好得帮助我们定位类的位置。

    虽然许多IDE现在采用一些启发式方法提供了这项功能,但是类型提示可以使IDE具有100%的检测准确率,并定位到类的位置。这样可以更平滑,更准确地检测变量类型在代码中的运行方式。

    请记住,虽然动态类型意味着任何变量都可以成为任何类型,但是所有变量在所有时间中都应只有一种类型。类型系统仍然是编程的核心组件,想想那些使用isinstance判断变量类型、应用逻辑所浪费的时间吧。
    3、 易于使用库
    使用类型提示意味着IDE可以拥有更准确、更智能的建议引擎。当调用自动完成时,IDE会完全放心地知道对象上有哪些方法/属性可用。此外,如果用户尝试调用不存在的内容或传递不正确类型的参数,IDE可以立即警告它。
    4、验证运行数据
    类型标注(Type annotations)是一种直接的方式,并且是类型文档中最常见到的那种方式。

    使用:语句将信息附加到变量或函数参数中。,
    ->运算符用于将信息附加到函数/方法的返回值中。

    好处
    这是实现类型提示的规范方式,这意味着是类型提示中最干净的一种方式。
    因为类型信息附加在代码的右侧,这样我们可以立刻明晰类型。

    缺点
    它不向后兼容。至少需要Python 3.6才能使用它。
    强制你导入所有类型依赖项,即使它们根本不在运行时使用。
    在类型提示中,会使用到复合类型,例如List[int]。而为了构造这些复杂类型,解释器在首次加载此文件时需要执行一些操作。


    类型标注的使用

    类型标注(Type annotations)是一种直接的方式,并且是类型文档中最常见到的那种方式。
    声明一个函数参数的类型,只要在参数名称的后面加个":“号,带上类型名称就行了。声明函数的返回值类型,只要在函数声明结束之前,也就是”:“号之前加入一个”->",带上类型名称。
    常见数据类型

    • int,long,float: 整型,长整形,浮点型
    • bool,str: 布尔型,字符串类型
    • List, Tuple, Dict, Set:列表,元组,字典, 集合
    • Iterable,Iterator:可迭代类型,迭代器类型
    • Generator:生成器类型

    1) 基本数据类型

    def test(a:int, b:str) -> str:
        print(a, b)
        return 1000
    
    if __name__ == '__main__':
        test('test', 'abc')
    

    函数test,a:int 指定了输入参数a为int类型,b:str b为str类型,-> str 返回值为srt类型。

    可以看到,在方法中,我们最终返回了一个int,此时pycharm就会有警告;
    当我们在调用这个方法时,参数a我们输入的是字符串,此时也会有警告;

    但非常重要的一点是,pycharm只是提出了警告,但实际上运行是不会报错,毕竟python的本质还是动态语言
    2)复杂的类型标注
    示例1

    from typing import List
    Vector = List[float]
    
    def scale(scalar: float, vector: Vector) -> Vector:
        return [scalar * num for num in vector]
    
    # typechecks; a list of floats qualifies as a Vector.
    new_vector = scale(2.0, [1.0, -4.2, 5.4])
    

    示例2

    from typing import Dict, Tuple, Sequence
    
    ConnectionOptions = Dict[str, str]
    Address = Tuple[str, int]
    Server = Tuple[Address, ConnectionOptions]
    
    def broadcast_message(message: str, servers: Sequence[Server]) -> None:
        ...
    
    # The static type checker will treat the previous type signature as
    # being exactly equivalent to this one.
    def broadcast_message(
        message: str,
        servers: Sequence[Tuple[Tuple[str, int], Dict[str, str]]]) -> None:
        ...
    ):
        ...
    

    这里需要注意,元组这个类型是比较特殊的,因为它是不可变的。
    所以,当我们指定Tuple[str, str]时,就只能传入长度为2,并且元组中的所有元素都是str类型

    3) 泛型指定

    from typing import Sequence, TypeVar, Union
    
    T = TypeVar('T')      # Declare type variable
    
    def first(l: Sequence[T]) -> T:   # Generic function
        return l[0]
    
    T = TypeVar('T')  # Can be anything
    A = TypeVar('A', str, bytes)  # Must be str or bytes
    A = Union[str, None] # Must be str or None
    

    创建变量时类型指定

    from typing import NamedTuple
    
    class Employee(NamedTuple):
        name: str
        id: int = 3
    
    employee = Employee('Guido')
    assert employee.id == 3
    

    4) 参数注释

    def send_mail(sender:      "fish@example.com",
                  receiver:    "panda@example.com",
                  subject:     "say hello to you.",
                  message:     "hello.",
                  attachments: list("type<io.BytesIO>")
                  ) -> bool:
        pass
    创建变量时类型指定
    

    写在":“号后面的并一定是一个类型。Python把这种写法称为"annotations”(标注),在运行的时候完全不使用它。它是专门设计出来给程序员和自动处理程序看的。任何可被计算出来的东西都可以写在那里。
    很明显,与直接写类型相比,直接把参数是什么样子写出来更容易让调用者看清楚函数的使用方法。更激进的话,标注还可以是被计算出来的。比如下面这个例子:

    def add_matrix3x3(x: [(1, 1, 1), (1, 1, 1), (1, 1, 1)],
                      y: [(2, 2, 2), (2, 2, 2), (2, 2, 2)],
                     ) ->[(3, 3, 3), (3, 3, 3), (3, 3, 3)]:
        pass
    

    *不足之处
    示例

    from typing import List
    
    def test(b: List[int]) -> str:
        print(b)
        return 'test'
    
    
    if __name__ == '__main__':
        test([1, 'a'])
    

    从这个例子可以看出来,虽然我们指定了List[int]即由int组成的列表,但是,实际中,只要这个列表中存在int(其他的可以为任何类型),就不会出现警告

    参考文章
    1、https://sikasjc.github.io/2018/07/14/type-hint-in-python/
    2、https://docs.python.org/zh-cn/3/library/typing.html
    3、https://hgoldfish.com/blogs/article/83/

    展开全文
  • 图书管理系统

    千次阅读 2019-07-03 01:09:25
    图书管理信息系统主要完成内容包括: 1)数据输入部分:主要包括图书基本信息录入、借阅人基本信息录入、用户基本信息录入。 2)数据输出部分:主要是各种统计查询,包括:根据图书信息(如书名、作者、...

    1.设计内容

    图书管理信息系统主要完成的内容包括:

    1)数据输入部分:主要包括图书基本信息的录入、借阅人基本信息的录入、用户基本信息的录入。

    2)数据输出部分:主要是各种统计查询,包括:根据图书信息(如书名、作者、出版社等)查阅图书及其借阅信息、统计输出图书类型比例等。

    3)数据处理部分:主要涉及借阅和归还的处理,如一本书借出后,必须在数据库中将该书标记为已借出,以防出现数据库中有书但图书馆无书的情况;一本书归还后,同样必须在数据库中将其标记为已经归还,以便再次借出。

    2.设计内容要求

    1) 读者种类的定义、更新、查询等。主要实现读者种类标准的制定,如:种类编号、种类名称、借书数量、借书期限、有效期限、备注等。

    2) 读者基本信息的输入、查询、更新等,包括读者编号、读者姓名、读者种类、读者性别、工作单位、家庭住址、电话号码、电子邮件地址、登记日期、备注等。

    3) 书籍类别的定义、更新、查询等。主要实现书籍类别标准的制定,如:类别编号、类别名称、关键词、备注信息等。

    4) 书籍信息的输入、查询、更新等,包括书籍编号、书籍名称、书籍类别、作者姓名、出版社名称、出版日期、价格、书籍页码、关键词、登记日期、是否被借出、备注信息等。

    5) 提供旧书销毁功能,对于淘汰、损坏、丢失的书目可及时对数据库进行修改。

    6) 借书信息的输入、查询、更新等,包括借阅编号、读者编号、读者姓名、书籍编号、书籍名称、出借日期、还书日期、备注信息等。

    7) 还书信息的输入、查询、更新等,包括选择借阅编号、读者编号、书籍编号、书籍名称、借书日期、还书日期、备注信息等。

    8) 提供方便的查询方法。如:以书名、作者、出版社、出版时间(确切的时间、时间段、某一时间之前、某一时间之后)等信息进行图书检索,并能反映出图书的借阅情况;以借阅人编号对借阅人信息进行检索;以出版社名称查询出版社联系方式信息等。

    9)提供统计分析功能。可以展现出图书类型比例、库存与借出比例等

    3.系统功能图、数据字典,E-R图等设计此处略写

    4.下面看一下系统的界面:

    1)登陆界面(本地)

    2)注册界面

    3)主页面(各个模块)

     

     

     

     

    项目总结:

    1.项目开始前,有必要对项目进行整体的把握,对于要完成的任务做到心中有数,同时进行时间分配、任务分配;

    2.队员间应统一意见,互相鼓励,互相帮助,共同朝着优秀的方向努力;

    3.边开发边测试,并保证各个模块不发生冲突;

    4.没有美工的情况下,先实现功能,再进行用户体验改进;

    5.充分利用好工具,对于已有的东西,不自己另搞一套;

    6.项目进行期间,队员充分交流,每天准时汇报各自进度,并把出现的、无法解决的问题抛出来;

    说明:3人团队完成作品,本人任组长,完成图书信息处理和借还书模块。其他不做过多详细介绍,谢谢观看!

    转载于:https://www.cnblogs.com/allenpengyu/p/3582211.html

    展开全文
  •  ... Log4j三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为...综合使用这三个组件可以轻松的记录信息类型和级别,并可以在运行时控制日志输出的样式和位置。下面对三个组件分别进行说明: 1、
  • 1、 log4cxx简介 ...综合使用这三个组件可以轻松地记录信息类型和级别,并可以在运行时控制日志输出的样式和位置。Loggers(记录器) Loggers组件在此系统中被分为六个日志输出级别(TRACE < DEBUG
  • 流行OJ系统,跨平台、易安装、题库。 版权说明 HUSTOJ is an GPL Free Software. HUSTOJ 是采用 GPL 自由软件。(仅限原创部分代码,其中使用了其他开源项目组件,请遵循原组件协议。) 注意:基于本项目...
  • Log4J日志配置详解 一、Log4j简介 ...综合使用这三个组件可以轻松地记录信息类型和级别,并可以在运行时控制日志输出的样式和位置。 1、Loggers Loggers组件在此系统中被分为五个级
  • 目前,8051单片机在工业检测领域中得到了广泛应用,因此我们可以在许多单片机应用领域中,配接各种类型的语音接口,构成具有合成语音输出能力综合应用系统,以增强人机对话功能。89C51是Intel公司生产一种...
  • 摘要:监督学习技术通过学习大量训练样本来构建预测模型,其中每个训练...本文综述了弱监督学习一些研究进展,主要关注三种弱监督类型:不完全监督:只有一部分训练数据具备标签;不确切监督:训练数据只具备粗粒...
  • stat既命令也同名函数,用来获取文件Inode里主要信息,所以stat命令的输出信息比ls命令的输出信息要更详细,stat 跟踪符号链接,lstat不跟踪符号链接,其中会输出对应文件文件名(File)、文件大小(Size)、...
  • 系统,就成了android系统级别工程师面对的主要问题。本书作者以实际的开发经验为基础,以软件工程思想为指导,完成了本书。本书介绍了从android开源工程到一个基于实际硬件产品中 的主要工作,一方面让读者清晰把握...
  • 引言 每次过节时候,各大电商优惠券已经成为了绝对关键词,最近一直在做优惠券需求,从最初...优惠券是一套规则组合,创建优惠券是优惠券系统设计第一步,主要有以下几部分组成:基本信息、优惠类型、...
  • 资产管理系统AMS.zip

    2019-08-09 09:53:15
    b)要求对用户管理操作修改信息,和删除用户 c)在每条信息后显示对应操作按钮,以便直接进行管理 输出 5、采购入库 功能描述 此模块提供资产管理人员添加采购单,校对采购单并入库操作 需要记录信息 采购...
  • 优惠券系统应该如何设计?

    千次阅读 2019-02-15 10:54:30
    引言 每次过节时候,各大电商优惠券已经成为了绝对关键词,最近一直在做优惠...优惠券是一套规则组合,创建优惠券是优惠券系统设计第一步,主要有以下几部分组成:基本信息、优惠类型、使用范围、有效期等...
  • J2EE汽车租赁系统

    热门讨论 2013-01-26 21:09:28
    当用户想要车看租车信息时,我们只设计了静态页面来供用户挑选,而没有将汽车的信息存储在一张表中,这样会给后期维护造成很大困难(如果想要添加进入新汽车类型的话,必须重新对界面进行布局,这样会造成很...
  • Linux系统常用命令

    2020-05-15 09:54:06
    目录查看系统日志查看一个程序是否运行终止线程查看文件(包括隐藏文件)输出当前工作目录复制文件创建目录删除目录移动文件重命名切换用户修改文件权限压缩文件列出压缩文件列表解压文件查看文件头10行查看文件尾10...
  • 在这一讲中,我们主要是了解一下 Linux 概况,以及对 Linux 一个初步感性认识。 一.什么是Linux? Linux 是一个以 Intel 系列 CPU(CYRIX,AMD CPU也可以)为硬件平台,完全免费 UNIX 兼容系统,完全...
  • 基于XML标准化格式输入和输出,使得各种类型数据可以共享和集成。2、能对历史数据更多认识,能够从历史数据中得到新关联信息和模式。对现有和过去合作设备进行评估,得到相应绩效值,并与预测绩效值...
  • 操作系统实验

    2013-12-30 11:30:48
    存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本设计的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。...
  • java学习之租车系统

    2018-04-19 20:34:00
    ​背景:三种类型的车供给用户来租用​ ​要求:控制台用户交互界面,根据用户需求输出租车价格,结果如下: 创建租车类主要设计过程: 创建租车类 创建Car父类,包含四种属性成员,重写构造方法 ...
  • 如果在一个类中定义了多个同名方法,它们或不同参数个数或不同参数类型,则称为方法重载(Overloading)。Overloaded方法是可以改变返回值的类型。 18、error和exception什么区别?  error 表示恢复...
  • 系统是一款由文章、图片、下载、分类信息、商城、求职招聘、影视、动漫(flash)、音乐、广告系统、个人/企业空间、小型互动论坛、友情链接、公告、调查等20多个功能模块,并集成自定义模型、自定义字段等功能组合而...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 721
精华内容 288
关键字:

信息系统输出的主要类型有