log4j2配置参数详解

2023-11-01

1.概述

JAVA常用的日志收集api和实现框架都有多种,不同的api和实现框架之间怎么相互兼容都比较复杂,不过大部分的日志框架实现也都提供了对其他日志收集方式的兼容和切换(可以参考slf4j、jcl、jul、log4j1、log4j2、logback大总结 - 乒乓狂魔 - OSCHINA - 中文开源技术交流社区)。本文主要介绍log4j2的Appenders下的组件列表,及几种比较常见的appender配置。

2.配置详解

log4j2.xml文件结构如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE xml>

<Configuration>

    <Properties>

        ...

    </Properties>

    <Appenders>

        ...

    </Appenders>

    <Loggers>

        ...

    </Loggers>

</Configuration>

配置文件由Properties、Appenders、Loggers三块组成。Properties配置基础变量,Loggers负责配置日志级别,Loggers配置日志收集方式、布局、输出、清理等功能。

2.1. appender组件列表

append 描述
AsyncAppender 用于接受其他类型appender的引用,并使用单独线程异步写入log
CassandraAppender 将日志写入Cassandra数据库中,需要提前建立keyspace和table
ConsoleAppender 其日志写入System.out或System.err,默认为System.out
FailoverAppender 故障转移appender,可以指定主appender,并且包含一组appender集合,当主appender写入失败,则会依次使用其他append写入,直至写入成功或者全部appender写入失败
FileAppender 将日志写入文件,使用FileManager执行io
FlumeAppender 将日志序列化后发送给Flume代理。
可选组件,由单独的jar提供。
JDBCAppender 使用标准JDBC将日志写入关系数据库表,必须使用连接池
JMS Appender 将日志发送至JMS中
JPAAppender 通过JPA将日志写入关系型数据库表,需要有单独的persistence.xml配置文件
HttpAppender 通过http请求发送日志,使用HttpURLConnection实现,响应2XX状态码为成功,否则抛出异常
KafkaAppender 将日志事件发送到Kafka的topic中
MemoryMappedFileAppender 2.1新增功能,将指定日志文件的一部分映射至内存,并将新日志事件写入此内存,达到阈值时将此内存刷新至存储设备
NoSQLAppender 使用内部轻量级Provider接口将日志事件写入NoSQL数据库。目前只有MongoDB和Apache CouchDB的Provider实现
NoSQLAppender for MongoDB 2.0.11开始,提供两个MongoDB模块:log4j-mongodb2、log4j-mongodb3
NoSQLAppender for MongoDB 2 使用MongoDB驱动程序版本2将日志写入MongoDB中
NoSQLAppender for MongoDB 3 使用MongoDB驱动程序版本3将日志写入MongoDB中
NoSQLAppender for Apache CouchDB 使用内部轻量级Provider将日志写入CouchDB中
OutputStreamAppender OutputStreamAppender不能直接配置,只是作为基础组件提供给其他Appender使用,如可以将日志事件写入输出流的File和Socket
RandomAccessFileAppender 与FileAppender相比,使用的I/O实现类不同,FileAppender使用FileOutputStream,RandomAccessFileAppender 使用RandomAccessFile。bufferedIO=true(默认是true)时,性能提高20-200% 。
RewriteAppender 用于在日志被其他Appender写入文件之前,通过RewritePolicy修改日志事件
RollingFileAppender 将日志写入文件,并根据TriggeringPolicy和RolloverPolicy规则将文件归档、清理
RollingRandomAccessFileAppender 与RollingFileAppender相比,使用的I/O实现类不同,RollingFileAppender使用FileOutputStream,RollingRandomAccessFileAppender使用RandomAccessFile。bufferedIO=true(默认是true)时,性能提高20-200% 。
RoutingAppender 配置不同的规则,将日志路由到不同的Appender进行输出
SMTPAppender 发生指定日志事件时,发送电子邮件
ScriptAppenderSelector 根据Script脚本的执行结果来选择AppenderSet中配置的Appender,并将结果输出至ScriptAppenderSelector的name中
SocketAppender 通过tcp或者udp,将日志写入远程目标中
SyslogAppender SyslogAppender是一个SocketAppender,它将其输出以符合BSD Syslog或RFC 5424格式的日志写入到远程目标
ZeroMQ/JeroMQ Appender ZeroMQ Appender使用JeroMQ库将日志事件发送到一个或多个ZeroMQ端点

2.2.ConsoleAppender

ConsoleAppender比较简单,就是把日志写入System.out或者System.err中,基本配置如下:

<Console name="STDOUT" target="SYSTEM_ERR">

    <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %t %5p [%c:%L] - %m%n" />

</Console>

Console一般使用基本配置就可以,唯一要注意的就是输出格式pattern,pattern的配置释义如下:

参数 描述
%c或%logger 输出logName,如 Logger log = LoggerFactory.getLogger(“com.test.logName”); 则输出为“com.test.logName” ,如果格式为%c{参数},则输出内容参考官网:image
%C或%class 输出为所在类的全路径名
d{pattern}或date{pattern} 输出时间,其中pattern可以是保留字,也可以是SimpleDateFormat中的字符。如
%d{DEFAULT} --> 2012-11-02 14:34:02,781
%d{DEFAULT_MICROS} --> 2012-11-02 14:34:02,123456
%d{yyyy-MM-dd HH:mm:ss.SSS} --> 2020-03-31 23:25:13.321
详见log4j PatternLayout
%F或%file 输出所在类名.java,如所在类为com.test.LogTest,则输出为LogTest.java
%l 输出错误的完整位置,全路径类名.方法名(类名.java:行号),如,com.test.LogTest.testLog(LogTest.java:31)
%L 输出行号
%m或%msg或%message 输出log.error(text)中的text内容
%M或%method 输出方法名
%n 换行符
%t或%thread 输出线程名
%u{“RANDOM” | “TIME”}或uuid 输出uuid
%sn或%sequenceNumber 输出自增序列
%r或%relative 输出从JVM启动到当前时刻的毫秒数
%T或%tid或%threadId 输出线程id
%t或%tn或%thread或%threadName 输出线程id
%tp或%threadPriority 输出线程优先级

 

2.3.RollingFileAppender

RollingFileAppender是一个OutputStreamAppender,可以根据TriggeringPolicy和RolloverPolicy将文件切割归档,通过RollingFileManager(扩展了OutputStreamManager)来实际执行文件I / O并执行归档。参数如下:

参数 类型 描述
append boolean 默认为true。如果为true,记录将附加到文件末尾。设置为false时,将在写入新记录之前清除文件
bufferedIO boolean 默认为true。如果为true,数据先写入缓冲区,如果缓冲区满或者immediateFlush 为true时,数据才被写入磁盘,如果为false直接写入磁盘。文件锁定不能与bufferedIO一起使用
bufferSize int 缓冲区大小。bufferedIO为true时,此参数有效,默认为8192 bytes
createOnDemand boolean 默认为false。按需创建文件。仅当日志事件通过所有Filter并且路由到该append时,append才创建文件
filter Filter 确定事件是否应由此Appender处理,通过CompositeFilter(对应标签为)可以使用多个过滤器
fileName String 要写入的文件名,如果不存在或者父目录不存在,则创建对应的文件或目录
filePattern String 归档文件的模式,取决于所使用的RolloverPolicy
immediateFlush boolean 默认为true。如果为true,每次写操作后都会将数据刷新入磁盘,可能会影响性能。
每次写入后刷新仅在使用同步appender时才有用。即使设置为false,异步appender也将在一批事件结束后自动刷新,这也可以确保效率更高的将数据写入磁盘。
layout Layout 格式化日志输出格式。如果未设置,则默认为’%m%n’
name String append名称
policy TriggeringPolicy 用于确定归档的触发条件
strategy RolloverStrategy 用于确定归档的文件名称、路径及归档方式
ignoreExceptions boolean 默认为true。设置为true时,如果记录日志发生异常,此条日志和异常将被忽略。设置为false时,异常将被抛出到调用方。如果此append用在FailoverAppender中,则必须设置为false。
filePermissions String 创建文件时指定文件的rwx权限,前提是文件系统应支持POSIX文件属性视图
fileOwner String 文件所有者。出于安全原因,更改文件的所有者可能受到限制,并且不允许操作时会抛出IOException。
如果_POSIX_CHOWN_RESTRICTED对路径有效,则只有有效用户ID等于文件用户ID或具有适当特权的进程才可以更改文件的所有权,前提是文件系统应支持文件所有者属性视图
fileGroup String 文件组。,前提是文件系统应支持POSIX文件属性视图

2.3.1.TriggeringPolicy

TriggeringPolicy是控制日志文件归档的触发条件。总共有四种类型的TriggeringPolicy,可以组合(CompositeTriggeringPolicy)多种触发策略来控制归档,标签为,如果配置了多种策略,则只要有一种策略返回true,就返回true。

<Policies>

  <!-- <CronTriggeringPolicy schedule="0 0 * * * ?"/> -->

  <OnStartupTriggeringPolicy minSize="2" />

  <SizeBasedTriggeringPolicy size="20 MB" />

  <TimeBasedTriggeringPolicy />

</Policies>

四种类型如下:

  • OnStartupTriggeringPolicy
    如果日志文件的时间比JVM的启动时间早,或者达到minSize的值,则会触发归档。
    minSize:触发文件归档的最小值,默认为1。
  • SizeBasedTriggeringPolicy
    当文件达到指定大小后,触发归档。大小可以通过size指定,单位为KB、MB、GB。与TimeBasedTriggeringPolicy配合使用时,filePattern中必须包含%i,否则文件每次归档时都会覆盖当前文件,因为TimeBasedTriggeringPolicy不会让文件名中的时间戳改变。如果不使用TimeBasedTriggeringPolicy,则SizeBasedTriggeringPolicy会让时间戳改变。
  • TimeBasedTriggeringPolicy
    当前时间与当前日志文件时间不匹配时,TimeBasedTriggeringPolicy会触发归档。参数如下:
参数 描述
interval 基于filePattern中配置的最小时间单位进行来控制归档频率,默认值为1。如:filePattern中最小时间单位为小时,如果interval=1,则1小时归档一次;如果interval=2,则2小时归档一次。
modulate 默认为false。指明是否对interval进行调节,若modulate为true,会以0为开始对interval进行偏移计算。例如,最小时间粒度为小时,当前为3:00,interval为4,则后面归档时间依次为4:00,8:00,12:00,16:00
maxRandomDelay 指示随机延迟过渡的最大秒数。默认情况下,该值为0,表示没有延迟。此设置在配置了多个应用程序以同时滚动日志文件的服务器上很有用,并且可以在整个时间上分散这样做的负担。
  • CronTriggeringPolicy
    基于cron表达式触发归档。此策略由计时器控制,并且与处理日志事件异步,因此上一个或下一个时间段的日志事件可能会出现在当前日志文件的开头或结尾。filePattern属性应包含一个时间戳,否则目标文件将在每次归档时被覆盖。参数如下:
参数 描述
schedule cron表达式,该表达式与Quartz调度程序中允许的表达式相同。详见CronExpression
EvaluationOnStartup 启动时,将根据文件的最后修改时间戳评估cron表达式。如果cron表达式指示应该在该时间和当前时间之间归档,则文件将立即被归档。

2.3.2.RolloverPolicy

用来控制文件归档方式,目前有两种类型如下:

2.3.2.1.DefaultRolloverStrategy

通过接收filePattern属性中日期/时间模式(%d)和整数(%i)来控制归档方式。如果存在日期/时间模式,则将在归档时使用当前时间替换filePattern中配置的日期/时间部分,如果模式包含整数,则它将在每次归档时递增。如果归档时在模式中同时包含日期/时间和整数,则整数将递增,直到日期/时间部分也将被替换。如果文件模式以“ .gz”,“.zip”,“.bz2”,“.deflate”,“.pack200”或“ .xz”结尾,则将使用与后缀匹配的压缩方案来压缩文件。 bzip2, Deflate, Pack200 and XZ格式要求有Apache Commons Compress组件,另外xz格式还要求有XZ for Java组件。

DefaultRolloverStrategy参数如下:

参数 描述
fileIndex 默认值为max。可选值为:min、max,2.8之后新增nomax。文件归档及新文件创建规则后面介绍。
min 计数器的最小值。预设值为1。
max 计数器的最大值。一旦达到此值,较旧的归档文件将在以后的转换中被删除。预设值为7。
compressionLevel 将压缩级别设置为0-9,其中0 =无,1 =最佳速度,直到9 =最佳压缩。仅针对ZIP文件实现
tempCompressedFilePattern 压缩期间归档日志文件的文件名的模式。

fileIndex设值不同,则文件归档及新文件创建及计数器递增方法都不同,计数器递增有三种方式,如下:

  • 方式一:fileIndex值为max
    假设将DefaultRolloverStrategy的min属性设置为1,将max属性设置为3,fileName是“ foo.log”,filePattern是“ foo-%i.log”,归档规则如下:
归档数 当前日志文件 归档文件 描述
0 foo.log - 所有日志记录都将转到初始文件
1 foo.log foo-1.log 第一次归档,foo.log重命名为foo-1.log。创建新的foo.log文件并继续写入
2 foo.log foo-2.log,foo-1.log 第二次归档,foo.log重命名为foo-2.log。创建新的foo.log文件并继续写入
3 foo.log foo-3.log,foo-2.log,foo-1.log 第三次归档,foo.log重命名为foo-3.log。创建新的foo.log文件并继续写入
4 foo.log foo-3.log,foo-2.log,foo-1.log 第四次和随后的归档,foo-1.log被删除,foo-2.log被重命名为foo-1.log,foo-3.log被重命名为foo-2.log,foo.log被重命名为foo-3.log。创建新的foo.log文件并继续写入。
  • 方式二:fileIndex值为min

假设将DefaultRolloverStrategy的min属性设置为1,将max属性设置为3,fileName是“ foo.log”,filePattern是“ foo-%i.log”,归档规则如下:

归档数 当前日志文件 归档文件 描述
0 foo.log - 所有日志记录都将转到初始文件
1 foo.log foo-1.log 第一次归档,foo.log重命名为foo-1.log。创建新的foo.log文件并继续写入
2 foo.log foo-1.log,foo-2.log 第二次归档,将foo-1.log重命名为foo-2.log,并将foo.log重命名为foo-1.log。创建新的foo.log文件并继续写入
3 foo.log foo-1.log,foo-2.log,foo-3.log 第三次归档,将foo-2.log重命名为foo-3.log,将foo-1.log重命名为foo-2.log,将foo.log重命名为foo-1.log。创建新的foo.log文件并继续写入
4 foo.log foo-1.log,foo-2.log,foo-3.log 第四次和随后的归档,删除foo-3.log,将foo-2.log重命名为foo-3.log,将foo-1.log重命名为foo-2.log,将foo.log重命名为foo -1.log。创建新的foo.log文件并继续写入。
  • 方式三:fileIndex值为nomax
    nomax为2.8新增属性,设置为nomax时,将忽略DefaultRolloverStrategy的最大值和最小值,每次归档生成的新文件相对于前一个文件编号加1,没有最大文件数限制。

2.3.2.2.DirectWriteRolloverStrategy

将日志事件直接写入由filePattern表示的文件。使用此策略文件不会执行重命名。如果是基于大小的触发策略,将在指定的时间段内写入多个文件,它们从1开始编号,并不断递增直到发生基于时间归档。

注意:如果filePattern的后缀表示应该进行压缩,则在关闭应用程序时不会压缩当前文件。此外,如果时间更改使得filePattern不再与当前文件匹配,则启动时也不会对其进行压缩。

DirectWriteRolloverStrategy模式参数如下:

参数 描述
maxFiles 与文件格式匹配的时间段内允许的最大文件数。如果超出文件数量,则最早的文件将被删除。如果指定,则该值必须大于1。如果该值小于零或省略,则文件数量将不受限制。
compressionLevel 将压缩级别设置为0-9,其中0 =无,1 =最佳速度,直到9 =最佳压缩。仅针对ZIP文件实现。
tempCompressedFilePattern 压缩期间归档日志文件的文件名的模式。

2.3.2.3.归档保留策略

DefaultRolloverStrategy模式下,Log4j-2.5引入了Delete(删除)操作(标签为),与 max属性所提供的功能相比,Log4j-2.5使用户可以更好地控制在归档时删除哪些文件。删除操作使用户可以配置一个或多个条件,以选择要相对于基本目录删除的文件。

注意:可以删除任何文件,而不仅仅是删除日志文件,因此请谨慎使用此操作!使用testMode参数,可以测试配置,而不会意外删除错误的文件。

delete参数如下:

参数 描述
basePath 必需。从此处开始扫描要删除的文件的基本路径。
maxDepth 要访问的目录的最大级别数。值为0表示仅访问起始文件,除非安全管理器拒绝。Integer.MAX_VALUE的值指示应访问所有级别。默认值为1,表示仅指定基本路径中的文件。
followLinks 是否遵循符号链接。默认为false。
testMode 如果为true,则不会删除文件,而是在INFO级别打印一条消息到状态记录器。使用此功能可以测试配置是否按预期工作。默认为false。
pathSorter 一个实现PathSorter 接口的插件, 用于在选择要删除的文件之前对文件进行排序。默认设置是首先对最近修改的文件进行排序。
pathConditions 如果未指定ScriptCondition,则为必需。

可以指定一个或多个PathCondition元素。如果指定了多个PathCondition元素,则需要所有的PathCondition结果都为true才会进行删除。PathCondition也可以嵌套。如果进行嵌套,则是先判断外层的PathCondition,然后进行内层的判断。如果没有嵌套,则是按顺序进行判断。

也可以创建自定义条件或使用内置条件:

IfFileName 如果文件名与此参数匹配则结果为true,此参数为正则表达式或 glob的文件。

IfLastModified 最后修改时间早于或等于此参数则结果为true,此参数为duration。

IfAccumulatedFileCount 文件数超过指定个数则结果为true,此参数为整型。

IfAccumulatedFileSize 所有文件总大小达到此参数则结果为true,此参数为KB、MB、GB。

IfAll 如果此标签下的所有条件都配置成功(逻辑与),则结果为true。

IfAny 如果此标签下的任何一个条件匹配成功(逻辑或),则结果为true。

IfNot 如果此标签下的所有条件都不匹配(逻辑非),则结果为true。

scriptCondition 如果未指定PathConditions,则为必需。指定脚本的ScriptCondition元素。ScriptCondition应该包含一个Script,ScriptRef或ScriptFile元素,该元素指定要执行的逻辑。(有关配置ScriptFiles和ScriptRefs的更多示例,另请参阅ScriptFilter文档。)该脚本传递了许多参数,包括在basePath下找到的路径列表(最大maxDepth),并且必须返回包含要删除的路径的列表。

3.日志归档+日志清理配置demo

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="WARN">

    <Properties>

        <Property name="logDir">/export/Logs/meeting/</Property>

        <Property name="logFile">gltLog</Property>

    </Properties>

    <Appenders>

        <Console name="STDOUT" target="SYSTEM_ERR">

            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %t %5p [%c:%L] - %m%n" />

        </Console>

        <!--日志名称及归档的压缩包名称及规则-->

        <RollingFile name="RollingFile" fileName="${logDir}/${logFile}.log"

                     filePattern="${logDir}/$${date:yyyy-MM}/${logFile}.%d{yyyy-MM-dd}-%i.log.gz">

            <!--日志输出格式-->

            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %t %5p [%c:%L] - %m%n" />

            <!--满足任何一个policy即进行归档-->

            <Policies>

                <!--当前日志与开始日期不匹配(RollingFile中配置的filePattern中配置的最小时间单位不匹配时)时进行归档-->

                <TimeBasedTriggeringPolicy/>

                <!--文件超过5M进行归档-->

                <SizeBasedTriggeringPolicy size="5 MB" />

            </Policies>

            <!--归档的文件最大数量-->

            <DefaultRolloverStrategy max="10">

                <!--删除规则-->

                <Delete basePath="${logDir}" maxDepth="2">

                    <!--匹配文件规则-->

                    <IfFileName glob="*.log.gz">

                        <IfLastModified age="7d">

                            <IfAny>

                                <!--logDir下文件总大小超过50M,进行删除-->

                                <IfAccumulatedFileSize exceeds="50 MB" />

                                <!--logDir下文件总数量超过10,进行删除-->

                                <IfAccumulatedFileCount exceeds="10" />

                            </IfAny>

                        </IfLastModified>

                    </IfFileName>

                </Delete>

            </DefaultRolloverStrategy>

        </RollingFile>

    </Appenders>

    <Loggers>

        <Root level="debug">

            <AppenderRef ref="STDOUT" />

            <AppenderRef ref="RollingFile" />

        </Root>

    </Loggers>

</Configuration>

 

<?xml version="1.0" encoding="UTF-8"?>

<Configuration status="WARN" monitorInterval="300">

   <!-- debug="true"xmlns:log4j="http://jakarta.apache.org/log4j/"-->

   <properties>

       <property name="LOG_HOME">logs/kg</property>

       <property name="FILE_NAME">kg</property>

   </properties>

   <Appenders>

       <Console name="Console" target="SYSTEM_OUT">

           <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36}:%M(%L)] - %msg%xEx%n"/>

       </Console>

       <RollingRandomAccessFile name="MyFile"

fileName="${LOG_HOME}/${FILE_NAME}.log"

filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd-HH}-%i.log">

           <PatternLayout

pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36}:%M(%L)] - %msg%xEx%n"/>

           <!-- 设置每天晚上12点清除过期日志文件 -->

           <CronTriggeringPolicy schedule="0 0 0 * * ?"/>

           <Policies>

               <TimeBasedTriggeringPolicy interval="1"/>

               <!--每1小时/分/... 生成一个文件, 时间依据filePattern的配置-->

               <SizeBasedTriggeringPolicy size="5 MB"/>

           </Policies>

           <DefaultRolloverStrategy max="30">

               <Delete basePath="${LOG_HOME}/$${date:yyyy-MM}/" maxDepth="2">

                   <IfFileName glob="*/*.log" />

                   <!--!Note: 这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用

                   另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!-->

                   <!--7天-->

                   <IfLastModified age="168H" />

               </Delete>

           </DefaultRolloverStrategy>

       </RollingRandomAccessFile>

   </Appenders>

   <Loggers>

       <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->

       <logger name="org.springframework" level="INFO"/>

       <logger name="org.mybatis" level="INFO"/>

       <Logger name="mylog" level="debug" additivity="false">

           <AppenderRef ref="MyFile"/>

           <AppenderRef ref="Console"/>

       </Logger>

       <Root level="debug">

           <AppenderRef ref="MyFile"/>

           <AppenderRef ref="Console"/>

       </Root>

   </Loggers>

</Configuration>

4.总结

log4j 2.x相对于1.x增加了大量的api及高级特性,由于目前很少用到其他appender组件,本文仅仅列了下所有的appender组件的作用,只介绍了几个常用的appender组件,后面用到其他组件在总结吧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

log4j2配置参数详解 的相关文章

  • 如何使用 Java 中的 Web 服务(例如 Axis2)发送复杂对象的数组或集合?

    我对 SOAP Web 服务还比较陌生 虽然我完成了一些较小的 Web 服务项目 但我偶然从来不需要返回 或用作参数 复杂 对象的数组或集合 当我尝试这样做时 根据我的 SOAP 绑定风格 我会得到不同的奇怪行为 当我使用RPC 文字 我可
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • 如何在android上的python kivy中关闭应用程序后使服务继续工作

    我希望我的服务在关闭应用程序后继续工作 但我做不到 我听说我应该使用startForeground 但如何在Python中做到这一点呢 应用程序代码 from kivy app import App from kivy uix floatl
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • org.apache.sling.api.resource,version=[2.3,3) -- 无法解析

    您好 我无法访问我的项目内容 我已经上传了从 CQ 访问内容所需的所有包 我唯一能看到的是 org apache sling api resource version 2 3 3 无法解析 这是否是异常的原因 如果是 请告诉我如何解决 中Q
  • 如何使用 Java 处理 Selenium WebDriver 中的新窗口?

    这是我的代码 driver findElement By id ImageButton5 click Thread sleep 3000 String winHandleBefore driver getWindowHandle drive
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 画透明圆,外面填充

    我有一个地图视图 我想在其上画一个圆圈以聚焦于给定区域 但我希望圆圈倒转 也就是说 圆的内部不是被填充 而是透明的 其他所有部分都被填充 请参阅这张图片了解我的意思 http i imgur com zxIMZ png 上半部分显示了我可以
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 将 SignedHash 插入 PDF 中以进行外部签名过程 -workingSample

    遵循电子书第 4 3 3 节 PDF 文档的数字签名 https jira nuxeo com secure attachment 49931 digitalsignatures20130304 pdf 我正在尝试创建一个工作示例 其中 客
  • 很好地处理数据库约束错误

    再一次 它应该很简单 我的任务是在我们的应用程序的域对象中放置一个具有唯一约束的特定字段 这本身并不是一个很大的挑战 我刚刚做了以下事情 public class Location more fields Column unique tru
  • 如何在 Java 中测试一个类是否正确实现了 Serialized(不仅仅是 Serialized 的实例)

    我正在实现一个可序列化的类 因此它是一个与 RMI 一起使用的值对象 但我需要测试一下 有没有办法轻松做到这一点 澄清 我正在实现该类 因此在类定义中添加 Serialized 很简单 我需要手动序列化 反序列化它以查看它是否有效 我找到了
  • Javafx过滤表视图

    我正在尝试使用文本字段来过滤表视图 我想要一个文本字段 txtSearch 来搜索 nhs 号码 名字 姓氏 和 分类类别 我尝试过在线实施各种解决方案 但没有运气 我对这一切仍然很陌生 所以如果问得不好 我深表歉意 任何帮助将不胜感激 我
  • IntelliJ - 调试模式 - 在程序内存中搜索文本

    我正在与无证的第三方库合作 我知道有一定的String存储在库深处的某个字段中的某处 我可以预测的动态值 但我想从库的 API 中获取它 有没有一种方法可以通过以下方式进行搜索 类似于全文搜索 full程序内存处于调试模式并在某个断点处停止
  • Cucumber Java 与 Spring Boot 集成 - Spring @Autowired 抛出 NullPointer 异常

    我正在为 Spring boot 应用程序编写 cucumber java 单元测试来测试每个功能 当我与 Spring Boot 集成时 Autowired 类抛出 NullPointer 异常 Spring Boot应用程序类 Spri
  • HQL Hibernate 内连接

    我怎样才能在 Hibernate 中编写这个 SQL 查询 我想使用 Hibernate 来创建查询 而不是创建数据库 SELECT FROM Employee e INNER JOIN Team t ON e Id team t Id t
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • ServletContainer 类未找到异常

    我无法再编译我的球衣项目 并且出现以下异常 GRAVE Servlet Project API threw load exception java lang ClassNotFoundException com sun jersey spi

随机推荐

  • JavaScript高手进阶:详解Eval加密

    在JavaScript编程中 涉及到代码加密 在混淆加密时代之前 用的最多的应该是种Eval加密 加密后的特征是以 eval function p a c k e r 为代码开始 相信很多人都见过这种代码 Eval加密效果例程 这是一种非常
  • MFC 解决中文乱码问题

    新的编译工具默认的是unicode编码方式 许多在多字节下面显示中文的方法已经不再适用了按照道理说设置为unicode编码后应该会很好的支持中文 但是实际情况很悲惨 显示的都是乱码 看到网上的很多方法都是把CSTRING转来转去 很头疼 感
  • powershell 删除指定文件夹及文件

    删除指定的文件夹 Get ChildItem C ccccc Recurse Where Object PsIsContainer Where Object FullName like test Remove Item Force Recu
  • SpringBoot配置多数据源

    项目框架 SpringBoot MyBatis Mysql 项目连接两个数据库源 1 application yml配置 使用DruidDataSource 主数据库为primary 副数据库为secondary 名称可以自己定义 只要和后
  • 如何使用Git进行版本控制

    在软件开发过程中 版本控制是一个非常重要的部分 它可以让开发人员更轻松地管理代码 集成代码 以及跟踪代码的变更历史 Git是一个广泛使用的版本控制工具 它的易用性和可扩展性使得它成为了开源社区的首选 在本文中 我们将介绍如何使用Git进行版
  • 转载 -- 按位异或的性质及其妙用

    https www jianshu com p 86a7cf855e51 文章摘要 1 按位异或 可以简单理解成 不进位加法 即 1 1 0 0 0 0 1 0 1 2 任何数和自己异或结果为零 3 按位异或的自反性 两次运算操作 可以将最
  • vs code下载慢的解决方法

    1 在官网Visual Studio Code Code Editing Redefined下载 大概率会出现如下情况 2 复制以上下载的链接地址 把以上截图红框标注的部分换成vscode cdn azure cn 这样会变成采用国内的镜像
  • canvas中的save和restore方法的作用

    save方法可以理解为暂存当前画笔的状态 接下来对画笔的操作都不会被保存下来 直到restore方法被调用 讲得通俗一点 就是说 调用save方法 就是把当前的笔放笔架上 换一支笔 调用restore方法时 再把刚才放到笔架上的笔再拿下来用
  • 使用Python对图像进行不同级别量化QP,使用RLE计算压缩比,并计算对应的PSNR

    写这篇博客源于 博友的提问 1 效果图 原图 VS QP 2 VS QP 4 VS QP 8效果图如下 QP量化是指把原始图像按像素级别划分取值 如QP 2 则 lt 128 取0 gt 128取128 QP 4 则 lt 64取0 lt
  • 无线dhcp服务器静态,wifi的ip设置dhcp和静态的区别

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 以网络为例 wifi的ip设置dhcp和静态的区别如下 1 静态IP地址 又称固定IP地址 是长期分配给一台计算机或网络设备使用的 IP 地址 一般来说 一般是特殊的服务器
  • MySQL经典入门

    MySQL数据库相关知识 数据库的基本概念 数据库的英文单词 DataBase 简称 DB 什么是数据库 用于存储和管理数据的仓库 数据库的特点 持久化存储数据的 其实数据库就是一个文件管理系统 方便存储和管理数据 使用了统一的方式操作数据
  • C++:vector中的resize()函数 VS reserve()函数

    写代码的时候无意错用了这两个函数 导致测试的时候 程序运行崩溃 发现这两个函数还是有区别的 void reserve size type n reserver函数用来给vector预分配存储区大小 即capacity的值 但是没有给这段内存
  • 三款开源工具让你的演示脱颖而出

    本文转载至 http blog callmewhy com 2014 07 02 three open source tools to make your presentations pop 不论是在商业圈还是在学术界 演示都是生活中不可或
  • 共享内存 设计原理-shm

    POSIX的shm open 在 dev shm 下打开一个文件 用mmap 映射到进程自己的内存地址 System V的shmget 得到一个共享内存对象的id 用shmat 映射到进程自己的内存地址 目前这里主要看 System V的设
  • VS无法打开 源 文件 "xxx.h" 问题

    项目属性 gt 配置属性 gt C C gt 常规 gt 附加包含目录 gt ProjectDir 即可
  • Qt QFrame

    QFrame类是带有边框部件的基类 lineWidth调整边框边界线的宽度 midLineWidth是在边框中插入一条线的宽度 用于营造3D效果 此效果只有在Box HlineVline凸起或者凹陷时有效 QFrame NoFrame 不绘
  • 【手拉手 带你准备电赛】解答小课堂——为什么要使能时钟

    大家在代码编写过程中也发现了 当我们涉及到外设时 总是需要使能其对应的时钟 那么为什么要使能时钟呢 直接用不是更简单 确实 直接使用IO 代码量可以小那么一丢丢 你可能会说 代码量算什么 这是老师少考我们一个考点 是我们可能不挂科的问题 手
  • Java数组排序:Java sort()方法

    在 Java 中实现数组排序的方式很多 除了利用 Arrays 类的 sort 方法外 还可以编写自定义方法来实现自己的排序算法 本文介绍如何使用 Arrays 类提供的 sort 方法来对数组进行排序 使用 java util Array
  • 一款基于Latex语法和MathJax渲染的零基础公式编辑器,数学公式插件

    零基础即可编辑公式 支持自定义编辑器配置和风格 支持二次编辑公式 支持作为插件和富文本编辑器一起使用 介绍 基于Latex语法和MathJax渲染的公式编辑器插件 易用 可二次编辑 内容可视化 标题为什么会开发该插件 之前调研过很多开源的公
  • log4j2配置参数详解

    1 概述 JAVA常用的日志收集api和实现框架都有多种 不同的api和实现框架之间怎么相互兼容都比较复杂 不过大部分的日志框架实现也都提供了对其他日志收集方式的兼容和切换 可以参考slf4j jcl jul log4j1 log4j2 l