logback的使用和logback.xml详解

原文地址:https://www.cnblogs.com/warking/p/5710303.html#4046335

作者:行走在云端的愚公

一、logback的介绍
  Logback是由log4j创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面下个模块:
  logback-core:其它两个模块的基础模块
  logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging
  logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能

二、logback取代log4j的理由:
  1、更快的实现:Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。
  2、非常充分的测试:Logback经过了几年,数不清小时的测试。Logback的测试完全不同级别的。
  3、Logback-classic非常自然实现了SLF4j:Logback-classic实现了SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了slf4j , 所 以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。
  4、非常充分的文档 官方网站有两百多页的文档。
  5、自动重新加载配置文件,当配置文件修改了,Logback-classic能自动重新加载配置文件。扫描过程快且安全,它并不需要另外创建一个扫描线程。这个技术充分保证了应用程序能跑得很欢在JEE环境里面。
  6、Lilith是log事件的观察者,和log4j的chainsaw类似。而lilith还能处理大数量的log数据 。
  7、谨慎的模式和非常友好的恢复,在谨慎模式下,多个FileAppender实例跑在多个JVM下,能 够安全地写道同一个日志文件。RollingFileAppender会有些限制。Logback的FileAppender和它的子类包括 RollingFileAppender能够非常友好地从I/O异常中恢复。
  8、配置文件可以处理不同的情况,开发人员经常需要判断不同的Logback配置文件在不同的环境下(开发,测试,生产)。而这些配置文件仅仅只有一些很小的不同,可以通过,和来实现,这样一个配置文件就可以适应多个环境。
  9、Filters(过滤器)有些时候,需要诊断一个问题,需要打出日志。在log4j,只有降低日志级别,不过这样会打出大量的日志,会影响应用性能。在Logback,你可以继续 保持那个日志级别而除掉某种特殊情况,如alice这个用户登录,她的日志将打在DEBUG级别而其他用户可以继续打在WARN级别。要实现这个功能只需加4行XML配置。可以参考MDCFIlter 。
  10、SiftingAppender(一个非常多功能的Appender):它可以用来分割日志文件根据任何一个给定的运行参数。如,SiftingAppender能够区别日志事件跟进用户的Session,然后每个用户会有一个日志文件。
  11、自动压缩已经打出来的log:RollingFileAppender在产生新文件的时候,会自动压缩已经打出来的日志文件。压缩是个异步过程,所以甚至对于大的日志文件,在压缩过程中应用不会受任何影响。
  12、堆栈树带有包版本:Logback在打出堆栈树日志时,会带上包的数据。
  13、自动去除旧的日志文件:通过设置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory属性,你可以控制已经产生日志文件的最大数量。如果设置maxHistory 12,那那些log文件超过12个月的都会被自动移除。

三、logback的配置介绍
  1、Logger、appender及layout
Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。
Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。
Layout 负责把事件转换成字符串,格式化的日志信息的输出。
  2、logger context
各个logger 都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各logger。其他所有logger也通过org.slf4j.LoggerFactory 类的静态方法getLogger取得。 getLogger方法以 logger名称为参数。用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用。
  3、有效级别及级别的继承
Logger 可以被分配级别。级别包括:TRACE、DEBUG、INFO、WARN 和 ERROR,定义于ch.qos.logback.classic.Level类。如果 logger没有被分配级别,那么它将从有被分配级别的最近的祖先那里继承级别。root logger 默认级别是 DEBUG。
  4、打印方法与基本的选择规则
打印方法决定记录请求的级别。例如,如果 L 是一个 logger 实例,那么,语句 L.info("..")是一条级别为 INFO的记录语句。记录请求的级别在高于或等于其 logger 的有效级别时被称为被启用,否则,称为被禁用。记录请求级别为 p,其 logger的有效级别为 q,只有则当 p>=q时,该请求才会被执行。
该规则是 logback 的核心。级别排序为: TRACE < DEBUG < INFO < WARN < ERROR

四、logback的默认配置
如果配置文件 logback-test.xml 和 logback.xml 都不存在,那么 logback 默认地会调用BasicConfigurator ,创建一个最小化配置。最小化配置由一个关联到根 logger 的ConsoleAppender 组成。输出用模式为%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n 的 PatternLayoutEncoder 进行格式化。root logger 默认级别是 DEBUG。
  1、Logback的配置文件
Logback 配置文件的语法非常灵活。正因为灵活,所以无法用 DTD 或 XML schema 进行定义。尽管如此,可以这样描述配置文件的基本结构:以<configuration>开头,后面有零个或多个<appender>元素,有零个或多个<logger>元素,有最多一个<root>元素。
  2、Logback默认配置的步骤
    (1). 尝试在 classpath下查找文件logback-test.xml;
    (2). 如果文件不存在,则查找文件logback.xml;
    (3). 如果两个文件都不存在,logback用BasicConfigurator自动对自己进行配置,这会导致记录输出到控制台。

五、logback.xml常用配置详解

 

  1、根节点<configuration>,包含下面三个属性:
    scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
    scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
    debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
  例如:
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
      <!--其他配置省略-->
    </configuration>
  2、子节点<contextName>:用来设置上下文名称,每个logger都关联到logger上下文,默认上下文名称为default。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
  例如:
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
      <contextName>myAppName</contextName>
      <!--其他配置省略-->
    </configuration>
  3、子节点<property> :用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。
    name: 变量的名称
    value: 的值时变量定义的值
  例如:
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
      <property name="APP_Name" value="myAppName" />
      <contextName>${APP_Name}</contextName>
      <!--其他配置省略-->
    </configuration>
  4、子节点<timestamp>:获取时间戳字符串,他有两个属性key和datePattern
    key: 标识此<timestamp> 的名字;
    datePattern: 设置将当前时间(解析配置文件的时间)转换为字符串的模式,遵循java.txt.SimpleDateFormat的格式。
  例如:
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/>
      <contextName>${bySecond}</contextName>
      <!-- 其他配置省略-->
    </configuration>
  5、子节点<appender>:负责写日志的组件,它有两个必要属性name和class。name指定appender名称,class指定appender的全限定名
    5.1、ConsoleAppender 把日志输出到控制台,有以下子节点:
      <encoder>:对日志进行格式化。(具体参数稍后讲解 )
      <target>:字符串System.out(默认)或者System.err(区别不多说了)
    例如:
    <configuration>
      <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
      </encoder>
      </appender>

      <root level="DEBUG">
        <appender-ref ref="STDOUT" />
      </root>
    </configuration>
    上述配置表示把>=DEBUG级别的日志都输出到控制台

    5.2、FileAppender:把日志添加到文件,有以下子节点:
      <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
      <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
      <encoder>:对记录事件进行格式化。(具体参数稍后讲解 )
      <prudent>:如果是 true,日志会被安全的写入文件,即使其他的FileAppender也在向此文件做写入操作,效率低,默认是 false。
    例如:
    <configuration>
      <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>testFile.log</file>
        <append>true</append>
        <encoder>
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender>

      <root level="DEBUG">
      <appender-ref ref="FILE" />
      </root>
    </configuration>
    上述配置表示把>=DEBUG级别的日志都输出到testFile.log

    5.3、RollingFileAppender:滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:
      <file>:被写入的文件名,可以是相对目录,也可以是绝对目录,如果上级目录不存在会自动创建,没有默认值。
      <append>:如果是 true,日志被追加到文件结尾,如果是 false,清空现存文件,默认是true。
      <rollingPolicy>:当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名。属性class定义具体的滚动策略类
      class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
        <fileNamePattern>:必要节点,包含文件名及“%d”转换符,“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。
如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;
如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
        <maxHistory>:
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且<maxHistory>是6,则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除。

      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
        <maxFileSize>:这是活动文件的大小,默认值是10MB。
        <prudent>:当为true时,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有两个限制,1不支持也不允许文件压缩,2不能设置file属性,必须留空。

      <triggeringPolicy >: 告知 RollingFileAppender 合适激活滚动。
      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根据固定窗口算法重命名文件的滚动策略。有以下子节点:
        <minIndex>:窗口索引最小值
        <maxIndex>:窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
        <fileNamePattern>:必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
      例如:
        <configuration>
          <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
              <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
              <maxHistory>30</maxHistory>
            </rollingPolicy>
            <encoder>
              <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
            </encoder>
          </appender>

          <root level="DEBUG">
            <appender-ref ref="FILE" />
          </root>
        </configuration>
        上述配置表示每天生成一个日志文件,保存30天的日志文件。
        <configuration>
          <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>test.log</file>

            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
              <fileNamePattern>tests.%i.log.zip</fileNamePattern>
              <minIndex>1</minIndex>
              <maxIndex>3</maxIndex>
            </rollingPolicy>

            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
              <maxFileSize>5MB</maxFileSize>
            </triggeringPolicy>
            <encoder>
              <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
            </encoder>
          </appender>

          <root level="DEBUG">
            <appender-ref ref="FILE" />
          </root>
        </configuration>
        上述配置表示按照固定窗口模式生成日志文件,当文件大于20MB时,生成新的日志文件。窗口大小是1到3,当保存了3个归档文件后,将覆盖最早的日志。
      <encoder>:对记录事件进行格式化。负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。
PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个<pattern>节点,用来设置日志的输入格式。使用“%”加“转换符”方式,如果要输出“%”,则必须用“\”对“\%”进行转义。
    5.4、还有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,并不常用,这里就不详解了。
大家可以参考官方文档(http://logback.qos.ch/documentation.html),还可以编写自己的Appender。
  6、子节点<loger>:用来设置某一个包或具体的某一个类的日志打印级别、以及指定<appender>。<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger
    name: 用来指定受此loger约束的某一个包或者具体的某一个类。
    level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity: 是否向上级loger传递打印信息。默认是true。同<loger>一样,可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。
  7、子节点<root>:它也是<loger>元素,但是它是根loger,是所有<loger>的上级。只有一个level属性,因为name已经被命名为"root",且已经是最上级了。
    level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能设置为INHERITED或者同义词NULL。 默认是DEBUG。
六、常用loger配置
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

<!--myibatis log configure-->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
七、Demo
  1、添加依赖包logback使用需要和slf4j一起使用,所以总共需要添加依赖的包有slf4j-api
logback使用需要和slf4j一起使用,所以总共需要添加依赖的包有slf4j-api.jar,logback-core.jar,logback-classic.jar,logback-access.jar这个暂时用不到所以不添加依赖了,maven配置
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <logback.version>1.1.7</logback.version>
    <slf4j.version>1.7.21</slf4j.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
      </dependency>
  </dependencies>

  2、logback.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/home" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>

<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>

  3、java代码
  /**
  * Hello world!
  */
  public class App {

  private final static Logger logger = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
      logger.info("logback 成功了");
      logger.error("logback 成功了");
      logger.debug("logback 成功了");
    }
  }
  4、输出
  

八、总结

logback的配置,需要配置输出源appender,打日志的loger(子节点)和root(根节点),实际上,它输出日志是从子节点开始,子节点如果有输出源直接输入,如果无,判断配置的addtivity,是否像上级传递,即是否向root传递,传递则采用root的输出源,否则不输出日志。

转载于:https://www.cnblogs.com/yyfyl/p/9589065.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tcp协议的主要功能是什么_前端要知道的网络知识一:TCP/IP 协议到底在讲什么...

你之所以不知道那套书在讲什么&#xff0c;是因为你还没有认识到网络协议有什么用&#xff0c;怎么用&#xff0c;以什么形式在使用&#xff0c;网络协议的概念很简单&#xff0c;就几句话&#xff0c;你只知道网络协议的概念&#xff0c;只知道很多大神都推荐这套书&#xff0…

php统计字符个数,php中3种方法统计字符串中每种字符的个数并排序

//这个方法纯粹是背函数&#xff0c;不解释&#xff1b;function countStr($str){$str_arraystr_split($str);$str_arrayarray_count_values($str_array);arsort($str_array);return $str_array;}//以下是例子&#xff1b;$str"asdfgfdas323344##$\$fdsdfg*$**$*$**$$4435…

mysql创建定时器(event),查看定时器,打开定时器,设置定时器时间

为什么80%的码农都做不了架构师&#xff1f;>>> 由于项目需要创建定时器&#xff08;evevt&#xff09;&#xff0c;所以就百度了一下&#xff0c;发现基本都是来源于一个模板&#xff0c;有些功能还不全&#xff0c;现在自己总结一下。 注&#xff1a;mysql版本是…

音频视频

1.IOS视频播放代码&#xff08;添加MediaPlayer.framework和#import&#xff09; -(void)playMovie:(NSString *)fileName{//视频文件路径NSString *path [[NSBundle mainBundle] pathForResource:fileName ofType:"mp4"];//视频URLNSURL *url [NSURL fileURLWithP…

二分查找、变形及应用

[LeetCode] 35 Search Insert Position 题目 Given a sorted array and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.You may assume no duplicates in the array. 测试案例 Input: […

linux内核怎么修改屏幕旋转方向_树莓派4—屏幕旋转

配置&#xff1a;树莓派4raspberry pi系统&#xff0c;HDMI显示&#xff0c;非触屏。问题&#xff1a;想将屏幕旋转90&#xff0c;按网上说的&#xff0c;方法一&#xff1a;在config.txt文件中添加display_rotate1&#xff0c;或者添加display_hdmi_rotate1&#xff0c;保存后…

周记随笔-php5.6与apache2.4的windows32安装

原材料&#xff1a;php.net , httpd.apache.org/download.cgi Apache的安装 &#xff0c;在下载页面有依赖关系的说明 。 下载对应版本的压缩包&#xff0c;解压至目标目录&#xff0c;例如D盘根目录&#xff0c;首先修改配置 1 serverRoot: ServerRoot "c:/Apache24"…

独家直播!阿里移动前端开源框架Weex揭秘

或许你写过了很多行代码&#xff0c;修过许多的bug&#xff0c;学过各种各样的语言&#xff0c;却只在一个最好的时机遇见了他…… 是啥&#xff1f; 敲&#xff01;黑&#xff01;板&#xff01;跟&#xff01;我&#xff01;念&#xff01;Weex&#xff5e;&#xff5e;&…

python异常值处理实例_利用Python进行异常值分析实例代码

前言 异常值是指样本中的个别值&#xff0c;也称为离群点&#xff0c;其数值明显偏离其余的观测值。常用检测方法3σ原则和箱型图。其中&#xff0c;3σ原则只适用服从正态分布的数据。在3σ原则下&#xff0c;异常值被定义为观察值和平均值的偏差超过3倍标准差的值。P(|x−μ|…

MSSQL 发布订阅,实现读写分离

主库做增删改&#xff0c;从库只读。 大部分的数据库压力&#xff0c;都是由查询引起的&#xff0c;读写分离可以减轻数据库的压力。 1、在(主)数据库上对需要同步的数据进行发布。 2、在(从)数据库上对(主)数据库的发布进行订阅。 注&#xff1a;发布订阅都需要实际的服务器名…

php get为空,php – $_GET在url有变量时为空

我有一个看起来像这个reglph的文件&#xff1f;lang no_NO& passkey test并试图获取密码变量,但它一直显示为空白.当我尝试print_r($_ GET);它打印Array()?!怎么会发生这种情况&#xff1f;该网站看起来像这样print_r($_GET);include(..\libs\Smarty.class.php);?>A…

Block

1、认识Block Block封装了一段代码,可以在任何时候执行Block可以作为函数参数或者函数的返回值&#xff0c;而其本身又可以带输入参数或返回值&#xff0c;它和传统的函数指针很类似&#xff0c;但是有区别&#xff1a;block是inline&#xff08;内联函数&#xff09;的&#x…

坚持学习WF(8):本地服务之调用外部方法

WF提供了一组核心服务&#xff0c;例如在SQL 数据库中存储工作流实例的执行详细信息的持久性服务&#xff0c;计划服务&#xff0c;事务服务和跟踪服务。除了这些WF也提供了另外一种服务&#xff0c;叫做Local Service也可以叫做Data exchange service。主要是实现工作流和宿主…

c++归并排序_合并排序法

一、合并排序(Merge Sort) 就是将多个有序数据表合并成一个有序数据表。如果参与合并的只有两个有序表&#xff0c;那么称为二路合并。对于一个原始的待排序序列&#xff0c;往往可以通过分割的方法来归结为多路合并排序。二、一个待排序的原始数据序列进行合并排序的基本思路是…

golang json数组拼接

2016年06月16日 15:38:25 阅读数&#xff1a;2575 标签&#xff1a; golang json 数组 更多 个人分类&#xff1a; golang func main() {a : []byte({"Parents": [ "aaaaa", "bbbbbbb" ]})b : []byte({"Parents": [ "Gomez"…

php课程设计实验心得,PHP程序设计教程实验及课程设计

部分 教程1 基础教程1.1 简介1.2 WampServer安装1.3 PHP语法1.4 变量1.5 echo和print语句1.6 数据类型1.7 字符串函数1.8 常量1.9 运算符1.10 条件语句1.11 Switch语句1.12 循环语句1.13 函数部分 教程1 基础教程1.1 简介1.2 WampServer安装1.3 PHP语法1.4 变量1.5 echo和print…

DRUID连接池的简单使用

DRUID——为监控而生的DB池 1. DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现&#xff0c;它结合了C3P0、DBCP、PROXOOL等DB池的优点&#xff0c;同时加入了日志监控&#xff0c;可以很好的监控DB池连接和SQL的执行情况&#xff0c;可以说是针对监控而生的DB连接池…

微习惯虽好,但是最重要的还是坚持

2019独角兽企业重金招聘Python工程师标准>>> “微习惯”一词是由美国的斯蒂芬盖斯提出的。他以前是个宅男&#xff0c;懒虫&#xff0c;为了改变自己而找到了这个方法。并且在自己身上实验成功。养成了好的读书、写作和健身的习惯&#xff0c;实现了人生的华丽转身。…

php手机端多图预览上传,JS实现多图预览上传的实例代码

这篇文章主要介绍了JS实现多张图片预览同步上传功能的相关资料,需要的朋友可以参考下废话不多说了&#xff0c;直接给大家贴代码了&#xff0c;具体代码如下所示&#xff1a;/*** Created by liujing on 2017/5/10.*/$(document).ready(function($) {function changef(which,bu…

带你了解zabbix整合ELK收集系统异常日志触发告警~

今天来了解一下关于ELK的“L”-Logstash,没错&#xff0c;就是这个神奇小组件&#xff0c;我们都知道&#xff0c;它是ELK不可缺少的组件&#xff0c;完成了输入&#xff08;input&#xff09;&#xff0c;过滤&#xff08;fileter&#xff09;&#xff0c;output&#xff08;输…