Logback 日志框架详解
一、Logback 简介
Logback 是一个日志框架,旨在成为 log4j 的替代品。它由 Ceki Gülcü 创建并维护,是一款开源的日志框架,是 slf4j(Simple Logging Facade for Java)的实现。相比于 log4j,Logback 具有更高的性能和更好的可扩展性,并提供了众多的特性,如异步日志、动态日志级别、决策器等。
在项目中使用 Logback 可以很方便地记录系统运行时的信息、警告和错误等,对于开发人员来说是非常有帮助的。
Logback 的基本概念。
- Logger:Logger 是 Logback 的核心概念,它用于记录日志。Logger 是按照类的层次结构进行命名的,每个 Logger 对象都有一个名字,如果没有显式指定名字,则使用当前类的全限定名作为它的名字。
- Appender:Appender 用于定义日志的输出方式,例如输出到控制台、写入文件、发送邮件等。Logback 有多种类型的 Appender,可以同时输出到多个目标。
- Layout:Layout 用于定义日志输出格式,例如日期格式、日志级别、线程名、类名等。Logback 有多种类型的 Layout,可以根据需求选择使用。
- Filter:Filter 用于对日志进行过滤,可以根据日志级别、关键字、线程名等条件进行过滤。
二、Logback 的主要功能和特点
1. Logback 的主要功能
Logback 的主要功能包括:
- 支持多种日志级别:Logback 支持多种日志级别,包括 TRACE、DEBUG、INFO、WARN 和 ERROR 等。
- 多种日志输出方式:Logback 支持将日志输出到控制台、文件、Syslog、JMS、邮件等多种输出方式,用户可以根据自己的需求选择不同的 Appender。
- 灵活的配置方式:Logback 的配置文件可以使用 XML 或者 Groovy 编写,非常灵活方便。
- 高性能:Logback 的性能非常好,可以满足高并发场景下的需求。
- 精细的过滤功能:Logback 支持使用 Filter 对日志进行精细的过滤操作,可以根据日志级别、线程名、关键字等条件进行过滤。
2. Logback 的特点
Logback 与其他日志系统相比,具有以下几个特点:
- 高性能:Logback 是目前 Java 日志框架中性能最好的一个,它支持异步输出和无锁数据结构等方式来提升性能。
- 灵活的配置:Logback 配置文件可以使用 XML 或者 Groovy 编写,非常灵活方便。同时,Logback 还提供了 Web 界面工具 JaninoConfigurer,可以通过 Web 页面来配置 Logback。
- 多种输出方式:Logback 支持多种输出方式,并且可以自定义 Appender 和 Layout,对于比较复杂的应用场景也可以很好地满足需求。
- 易于集成:对于 Spring、Hibernate、Lucene 等流行框架,Logback 都提供了官方的集成插件,使用起来非常方便。
三、Logback 常用配置
1. name 属性
Logger 中的 name 属性用于记录器的命名,它是一个字符串,可以用任何字符串来命名 Logger。Logback 中同一个 Logger 可以有多个子 Logger,它们之间构成了一个层次结构,其命名规则按照“类所在包名+类名称”的方式进行。例如:
<logger name="com.demo.UserService" level="DEBUG" additivity="false"><appender-ref ref="FILE"/><appender-ref ref="CONSOLE"/>
</logger>
上述配置中,Logger 的 name 属性为 com.demo.UserService,表示一个 UserService 类的 Logger。如果不指定 name,则默认使用 RootLogger,即根 Logger。
2. level 属性
Logger 的 level 属性用于指定输出的日志级别,Logback 日志的级别由低到高分别为 TRACE、DEBUG、INFO、WARN、ERROR、OFF。若设置了 Logger 的 level 属性,则将只输出指定级别及更高级别的日志信息,例如:
<logger name="com.demo.UserService" level="DEBUG" additivity="false"><appender-ref ref="FILE"/><appender-ref ref="CONSOLE"/>
</logger>
上述配置中,Logger 的 level 属性为 DEBUG,表示只输出 DEBUG 级别及更高级别的日志信息。
3. additivity 属性
additivity 属性表示是否继承父 Logger 的 Appender,即是否在父 Logger 的 Appender 中同时输出相同的日志信息。如果为 false,则该 Logger 只会将日志信息输出到自己指定的 Appender 中,并不会将日志信息传递给父 Logger。默认情况下,additivity 属性为 true。
<logger name="com.demo.UserService" level="DEBUG" additivity="false"><appender-ref ref="FILE"/><appender-ref ref="CONSOLE"/>
</logger>
上述配置中,additivity 属性为 false,表示 UserService Logger 只会将日志信息输出到自己指定的 Appender,而不会将日志信息传递给 RootLogger(父 Logger)。
4. ConsoleAppender 配置
ConsoleAppender 可以将日志信息输出到控制台,配置示例如下:
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><target>System.out</target><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern></encoder>
</appender>
上述配置中,我们定义了一个名为 CONSOLE 的 Appender,其 class 属性指定为 ch.qos.logback.core.ConsoleAppender,表示输出到控制台。具体细节如下:
(1)target:指定输出目标,可以是 System.out 或 System.err,默认为 System.out。
(2)encoder:指定输出格式,通常使用 PatternLayoutEncoder 来指定输出格式,具体内容详见 Layout 配置。
5. FileAppender 配置
FileAppender 可以将日志信息输出到文件中,配置示例如下:
<appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>log/test.log</file><append>false</append><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} : %msg%n</pattern></encoder>
</appender>
上述配置中,我们定义了一个名为 FILE 的 Appender,其 class 属性指定为 ch.qos.logback.core.FileAppender,表示输出到文件。具体细节如下:
(1)file:指定输出文件路径及名称。
(2)append:指定是否追加数据到输出文件中,若为 true 则追加,否则覆盖,默认值为 true。
(3)encoder:指定输出格式,通常使用 PatternLayoutEncoder 来指定输出格式,具体内容详见 Layout 配置。
6. RollingFileAppender 配置
RollingFileAppender 可以将日志信息输出到文件中,同时支持按时间、大小等条件进行切割,以避免单个日志文件过大的问题,配置示例如下:
<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>log/test.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>log/test.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} : %msg%n</pattern></encoder>
</appender>
上述配置中,我们定义了一个名为 ROLLING_FILE 的 Appender,其 class 属性指定为 ch.qos.logback.core.rolling.RollingFileAppender,表示输出到文件。具体细节如下:
(1)file:指定输出文件路径及名称。
(2)rollingPolicy:指定切割策略,此处使用的是 ch.qos.logback.core.rolling.TimeBasedRollingPolicy,表示按时间切割。fileNamePattern 即指定切割后文件名称的格式,maxHistory 指定最大的历史文件个数。
(3)encoder:指定输出格式,通常使用 PatternLayoutEncoder 来指定输出格式,具体内容详见 Layout 配置。
7. SMTPAppender 配置
SMTPAppender 可以将日志信息以邮件形式发送到指定邮箱,配置示例如下:
<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender"><smtpHost>smtp.test.com</smtpHost><smtpPort>465</smtpPort><ssl>true</ssl><username>test@test.com</username><password>123456</password><to>test1@test.com,test2@test.com</to><from>test@test.com</from><subject>错误日志</subject><layout class="ch.qos.logback.classic.html.HTMLLayout"/><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter>
</appender>
上述配置中,我们定义了一个名为 EMAIL 的 Appender,其 class 属性指定为 ch.qos.logback.classic.net.SMTPAppender,表示通过邮件发送日志信息。具体细节如下:
(1)smtpHost、smtpPort:指定邮件服务器的地址和端口。
(2)ssl:是否使用 SSL 连接邮件服务器。
(3)username、password:邮件服务器的登录账号和密码。
(4)to、from:指定接收邮件的邮箱地址和发送者邮箱地址。
(5)subject:邮件主题。
(6)layout:指定输出格式,可以使用各种 Layout 类型,此处使用的是 HTMLLayout。
(7)filter:指定过滤条件,此处使用的是 ThresholdFilter,表示只发送 ERROR 级别及以上的日志信息。
8. PatternLayout 配置
PatternLayout 可以按照指定的格式输出日志信息,下面是一些常用的格式占位符及其含义:
(1)%d{HH:mm:ss.SSS}:输出日志的时间,精确到毫秒。
(2)[%thread]:输出日志的线程名。
(3)%-5level:输出日志级别,左对齐并占位 5 个字符,若不足则用空格补齐。
(4)%logger{36}:输出日志所在类的名称,最长 36 个字符。
(5): %msg%n:输出日志消息及换行符。
配置示例如下:
<encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} : %msg%n</pattern>
</encoder>
上述配置中,我们使用 PatternLayoutEncoder 来指定输出格式,其 pattern 属性指定了输出格式。具体细节可见上面的格式占位符及其含义。
9. HTMLLayout 配置
HTMLLayout 可以将日志信息以 HTML 格式进行输出,用于可视化展示和查看。配置示例如下:
<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
上述配置中,我们使用 HTMLLayout 类型来指定输出格式,其 class 属性指定为 ch.qos.logback.classic.html.HTMLLayout。如果需要添加样式和自定义输出内容,可以通过 CSS 和 Header、Footer 配置进行实现。
10. LevelFilter 配置
LevelFilter 用于根据日志级别过滤日志信息,可用于只记录某些级别的日志信息或忽略某些级别的日志信息,配置示例如下:
<filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>DENY</onMatch><onMismatch>ACCEPT</onMismatch>
</filter>
上述配置中,我们使用 LevelFilter 类型来指定过滤器,其 class 属性指定为 ch.qos.logback.classic.filter.LevelFilter。具体细节如下:
(1)level:指定要过滤的日志级别。
(2)onMatch:指定当过滤条件匹配时要执行的操作,此处使用 DENY 表示拒绝输出。
(3)onMismatch:指定当过滤条件未匹配时要执行的操作,此处使用 ACCEPT 表示接受输出。
- DuplicateMessageFilter 配置
DuplicateMessageFilter 用于过滤掉重复的日志信息,即当多个日志消息内容相同时,只记录其中一个日志信息,可用于减少日志量或避免误导信息,配置示例如下:
<filter class="ch.qos.logback.classic.filter.DuplicateMessageFilter"><allowedRepetitions>1</allowedRepetitions>
</filter>
上述配置中,我们使用 DuplicateMessageFilter 类型来指定过滤器,其 class 属性指定为 ch.qos.logback.classic.filter.DuplicateMessageFilter。allowedRepetitions 属性指定了允许的重复次数,此处设置为 1 表示当某个日志消息出现重复内容时,只记录一次该日志信息。
四、配置示例
1. 一个简单常用的配置
<?xml version="1.0" encoding="UTF-8"?><configuration><!-- 定义日志文件保存的路径和文件名 --><property name="LOG_HOME" value="/var/log/myapp"/><property name="APP_NAME" value="myapp"/><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 按日期拆分的文件输出 --><appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_HOME}/${APP_NAME}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_HOME}/${APP_NAME}-%d{yyyy-MM-dd}.log.gz</fileNamePattern></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 过滤一些无用的日志 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>INFO</level></filter><!-- 设置日志记录器 --><logger name="com.mypackage" level="debug" additivity="false"><appender-ref ref="rollingFile"/><appender-ref ref="console"/></logger><!-- 根的日志记录器 --><root level="error"><appender-ref ref="rollingFile"/><appender-ref ref="console"/></root></configuration>
上述配置代码中,控制台输出和按日期拆分的文件输出是两个常见的 appender。这里也可以添加其他的 appender 来实现将日志发往不同渠道(邮件、数据库等),根据需要进行修改即可。在日志文件备份方面,这里使用了 TimeBasedRollingPolicy 滚动策略,可以在每天或每个小时结束时生成一个新的日志文件。当然,也可以使用 SizeAndTimeBasedRollingPolicy 等其他的日志文件备份策略。
注意,上述代码中的路径、文件名、包名等都是示例,实际应用时需要根据具体情况进行修改。
2. ELK相关配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} : %msg%n</pattern></encoder></appender><appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>logs/app.%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{35} : %msg%n</pattern></encoder></appender><appender name="logstash" class="ch.qos.logback.core.net.SyslogAppender"><syslogHost>${ELK_HOST}</syslogHost><syslogPort>${ELK_PORT}</syslogPort><suffixPattern>%msg%n</suffixPattern><facility>USER</facility><includeMDC>true</includeMDC><layout class="net.logstash.logback.layout.LogstashLayout"><jsonFormatter class="net.logstash.logback.jackson.LogstashJacksonJsonProvider"/><fieldNames><message>log</message></fieldNames><customFields>{"app_name":"${appName}"}</customFields></layout></appender><logger name="com.example" level="INFO"><appender-ref ref="logstash"/><appender-ref ref="console"/><appender-ref ref="file"/></logger><root level="INFO"><appender-ref ref="logstash"/><appender-ref ref="console"/><appender-ref ref="file"/></root></configuration>
3. 比较详细的配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><!-- 定义日志文件保存的路径和文件名 --><property name="LOG_DIR" value="/var/log/myapp"/><property name="APP_NAME" value="myapp"/><!-- 控制台输出 --><appender name="console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 按日期拆分的文件输出 --><appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_DIR}/${APP_NAME}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_DIR}/${APP_NAME}-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter></appender><!-- 异步输出日志,避免阻塞主线程 --><appender name="asyncAppender" class="ch.qos.logback.classic.AsyncAppender"><queueSize>1024</queueSize><appender-ref ref="rollingFile"/><!-- 还可以添加其他 appender --></appender><!-- 按大小和日期拆分的文件输出,比较灵活 --><appender name="rollingFile2" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_DIR}/${APP_NAME}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_DIR}/${APP_NAME}-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>30</maxHistory><totalSizeCap>10GB</totalSizeCap></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>DEBUG</level></filter></appender><!-- 根据系统环境变量动态配置日志级别 --><appender name="dynamicThresholdLogging" class="ch.qos.logback.classic.sift.SiftingAppender"><discriminator><key>env</key><defaultValue>dev</defaultValue></discriminator><sift><appender name="FILE-${env}" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_DIR}/${APP_NAME}-${env}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_DIR}/${APP_NAME}-${env}-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>${env == 'prod' ? 'INFO' : 'DEBUG'}</level></filter></appender></sift></appender><!-- 设置日志记录器 --><logger name="com.mypackage" level="debug" additivity="false"><appender-ref ref="asyncAppender"/></logger><!-- 根的日志记录器 --><root level="error"><appender-ref ref="asyncAppender"/><appender-ref ref="console"/></root><!-- MDC(Mapped Diagnostic Context) --><conversionRule conversionWord="reqId" converterClass="com.acme.logback.ReqIdConverter"/><appender name="mdcDemo" class="ch.qos.logback.classic.net.SyslogAppender"><syslogHost>localhost</syslogHost><facility>LOCAL0</facility><suffixPattern>%mdc{reqId} - %message</suffixPattern></appender><logger name="com.acme.service" level="TRACE"><appender-ref ref="mdcDemo"/></logger><!-- MDC 的另一种使用方式:通过配置文件 --><appender name="mdcDemo2" class="ch.qos.logback.classic.net.SyslogAppender"><syslogHost>localhost</syslogHost><facility>LOCAL0</facility><suffixPattern>%X{reqId} - %message</suffixPattern></appender><logger name="com.acme.service2" level="TRACE"><appender-ref ref="mdcDemo2"/></logger><!-- Logback Groovy 编写复杂的过滤条件 --><appender name="groovyDemo" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_DIR}/${APP_NAME}.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_DIR}/${APP_NAME}-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder><filter class="ch.qos.logback.core.filter.Filter"><groovy>def mdc = event.getMDC()if (mdc == null) {return FilterReply.NEUTRAL}def user = mdc.get("user")if (user == null || !user.equals("admin")) {return FilterReply.DENY}return FilterReply.ACCEPT</groovy></filter></appender><logger name="com.mypackage2" level="debug"><appender-ref ref="groovyDemo"/></logger><!-- JMX 监控,可以在 JConsole 或者 JVisualVM 中查看 --><jmxConfigurator/><statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/><!-- 日志分离存储 --><appender name="dbAppender" class="com.example.logback.appender.DBAppender"><connectionSource class="com.example.logback.datasource.DataSourceConnectionSource"><url>jdbc:mysql://localhost:3306/dbname</url><user>username</user><password>password</password><driverClass>com.mysql.jdbc.Driver</driverClass><minConnectionsPerPartition>5</minConnectionsPerPartition><maxConnectionsPerPartition>20</maxConnectionsPerPartition><partitionCount>2</partitionCount></connectionSource><bufferSize>1000</bufferSize><tableName>logs</tableName><columns><column name="timestamp" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}" /><column name="level" pattern="%level" /><column name="logger" pattern="%logger" /><column name="message" pattern="%message" /></columns></appender><logger name="com.example.myapp" level="INFO"><appender-ref ref="asyncAppender"/><appender-ref ref="dbAppender"/></logger></configuration>
此份 Logback 配置有以下功能:
- 按大小和日期拆分的文件输出:可以通过配置文件来实现,比较灵活;
- 根据系统环境变量动态配置日志级别:可以根据环境变量的值来决定输出的日志级别;
- MDC(Mapped Diagnostic Context):通过为每个线程关联一个 Map 来实现在日志输出中添加自定义的上下文信息,例如请求 ID、用户信息等;
- 可以通过配置文件或者编写 Java 类来使用 MDC;
- 可以通过 Groovy 或者 JavaScript 等脚本语言来编写复杂的过滤条件,可以根据日志事件中的任意字段来决定是否输出;
- JMX 监控:可以在 JConsole 或者 JVisualVM 中查看 Logback 使用情况和日志输出;
- 日志分离存储:将日志输出到数据库中。
需要注意的是,上述配置代码的变量值和路径都是示例,实际使用时需要根据实际情况进行修改。
相关文章:
Logback 日志框架详解
一、Logback 简介 Logback 是一个日志框架,旨在成为 log4j 的替代品。它由 Ceki Glc 创建并维护,是一款开源的日志框架,是 slf4j(Simple Logging Facade for Java)的实现。相比于 log4j,Logback 具有更高的…...
BIO、NIO、AIO 有什么区别?
BIO (Blocking I/O): Block IO 同步阻塞式 IO ,传统 IO,特点是模式简单、使用方便,并发处理能力低。 同步阻塞 I/O 模式,数据的读取写入必须阻塞在一个线程内等待其完成,在活动连接数不是特别高(…...
nginx和tomcat负载均衡、静态分离
tomcat重要目录 bin 存放启动和关闭Tomcat脚本conf存放Tomcat不同的配置文件doc存放Tomcat文档lib存放Tomcat运行需要的库文件logs存放Tomcat执行时的log文件src存放Tomcat的源代码webappsTomcat的主要Web发布目录work存放jsp编译后产生的class文件 nginx负载均衡原理 nginx实…...
用AI写出的高考作文!
今天是6月7日,又到了每一年高考的日子。小灰自己参加高考是在2004年,距离现在已经将近20年,现在回想起来,真的是恍如隔世。 今天高考语文的作文题是什么呢? 全国甲卷的题目是:人技术时间 人们因技术发展得以…...
chatgpt赋能python:Python屏幕输入介绍:了解命令行输入的基本知识
Python屏幕输入介绍:了解命令行输入的基本知识 Python是一种使用广泛的编程语言,用于编写各种类型的应用程序,包括图形用户界面应用程序和基于命令行的应用程序。对于基于命令行的应用程序来说,屏幕输入非常重要。本文将介绍Pyth…...
bert中文文本摘要代码(1)
bert中文文本摘要代码 写在最前面关于BERT使用transformers库进行微调 load_data.py自定义参数collate_fn函数BertDataset类主函数 tokenizer.py创建词汇表encode函数decode函数 写在最前面 熟悉bert+文本摘要的下游任务微调的代码,方便后续增加组件实现…...
为何溃坝事故频发,大坝安全如何保障?
随着水利水电工程的重要性日益突显,水库大坝安全越来越受到相关部门的重视。因为大坝的安全直接影响水利工程的功能与作用,因此对大坝安全的监测显得十分必要。大坝安全监测的作用是能够及时掌握大坝的运行状态,及时发现大坝的变形、渗漏等异…...
第十九章_手写Redis分布式锁
锁的种类 单机版同一个JVM虚拟机内synchronized或者Lock接口。 分布式多个不同JVM虚拟机,单机的线程锁机制不再起作用,资源类在不同的服务器之间共享了。 一个靠谱分布式锁需要具备的条件和刚需 独占性 :OnlyOne,任何时刻只能有且…...
电路设计【8】原理图中VCC、VDD、VEE、VSS、VBAT各表示什么意思
文章目录 一、名词解析二、应用讲解三、举例分析:为什么stm32vet6中要分出5对VDD VSS?它们分别负责哪些模块的供电? 一、名词解析 (1)VCC:Ccircuit 表示电路的意思, 即接入电路的电压 (2&…...
Volatile、Synchronized、ReentrantLock锁机制使用说明
一、Volatile底层原理 volatile是轻量级的同步机制,volatile保证变量对所有线程的可见性,不保证原子性。 当对volatile变量进行写操作的时候,JVM会向处理器发送一条LOCK前缀的指令,将该变量所在缓存行的数据写回系统内存。由于缓…...
港联证券|AI概念股继续活跃 科创50指数逆势走高
周三,A股市场出现极致分化态势。得益于存储芯片为代表的硬科技股的强势,科创50指数逆势走高。但创业板指、深证成指等主要股指仍然跌跌不休,沪指险守3200点关口。AI概念股继续逆势活跃,国资云、数据方向领涨,算力概念股…...
分布式事务一 事物以及分布式事物介绍
一 事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务由一组SQL语句组成。事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(at…...
【十四】设计模式~~~行为型模式~~~中介者模式(Java)
【学习难度:★★★☆☆,使用频率:★★★★★】 3.1. 模式动机 建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应。在此,发生改变的对象称为观察目标&#…...
css3--nth-child的用法
目录 使用CSS nth-child选择器基本用法使用公式从零开始关键点结论 使用CSS nth-child选择器 CSS的 :nth-child 选择器是一个强大的工具,允许我们根据它们在父元素中的位置选择元素。这为我们提供了更大的灵活性来控制页面上的元素。 基本用法 基本形式为 :nth-c…...
【假捻发加工生产工单下达】
假捻工单是需要下到工作中心的,比如A01机台或者A02机台。 所以下工单之前要先查询A01机台上的最新工单量。 查询结果如下: 她会按照创建时间进行排序,后下的工单排在最前面 (如果下了个新工单,那么前一个工单的执行状态会自动改为关闭。) 因此查询结果,最上面的工单执…...
Go for-range VS for
Go 语言中,for-range 可以用来遍历string、数组(array)、切片(slice)、map和channel,实际使用过程踩了一些坑,所以,还是总结记录下for-range的原理。 首先,go是值传递语言。变量是指针类型,复制指针传递&a…...
大数据教程【01.01】--大数据介绍及开发环境
更多信息请关注WX搜索GZH:XiaoBaiGPT 大数据简介 大数据(Big Data)是指规模庞大、结构复杂、增长速度快且难以使用传统技术处理的数据集合。大数据分析可以帮助企业和组织从海量的数据中提取有价值的信息,用于业务决策、市场分析、…...
文件阅览功能的实现(适用于word、pdf、Excel、ppt、png...)
需求描述: 需要一个组件,同时能预览多种类型文件,一种类型文件可有多个的文件。 看过各种博主的方案,其中最简单的是利用第三方地址进行预览解析(无需任何插件); 这里推荐三个地址:…...
面试-RabbitMQ常见面试问题
1.什么是RabbitMQ? RabbitMQ是一款基于AMQP协议的消息中间件,消费方并不需要确保提供方的存在,实现服务之间的高度解耦。 基本组成有: Queue:消息队列,存储消息,消息送达队列后转发给指定的消费方Exchange:消息队列交…...
使用VBA在单元格中快速插入Unicode符号
Unicode 符号 Unicode 符号在实际工作中有着广泛的应用,比如用于制作邮件签名、文章排版、演示文稿制作等等。在 Excel 表格中,插入符号可以让表格的排版更加美观,同时也能够帮助用户更清晰地表达意思。 Dingbats Dingbats是一个包含装饰符…...
告别“替身攻击”:手把手教你用零阶优化(ZOO)直接黑盒攻击DNN模型
零阶优化实战:无需替代模型的黑盒对抗攻击指南 当面对一个部署在云端的深度学习API时,传统白盒攻击手段往往束手无策——既无法获取模型架构,也不能执行反向传播。本文将揭示如何运用零阶优化技术,仅通过输入输出查询就能构造高效…...
Python从入门到精通(第08章):列表、元组、集合与字典
Python从入门到精通(第08章):列表、元组、集合与字典 开头导语 这是本系列第08章。本文采用"知识点讲解 + 错误示例 + 正确写法 + 自测清单"的结构,目标是让你不仅能看懂,还能独立写出可运行代码。建议你边看边敲,所有示例都亲自执行一次。 章节摘要 本章围…...
从Buck到三电平:软开关DC-DC变换器的Simulink建模与双闭环控制仿真
1. 从Buck到三电平:电力电子技术的进化之路 记得我第一次接触DC-DC变换器时,Buck电路就像是一道必须跨过的门槛。这个经典的降压电路结构简单,却蕴含着电力电子最基础的设计思想。但随着项目需求的提升,传统Buck电路在高压大功率场…...
Realistic Vision V5.1 创意工作流:利用GitHub管理提示词库与生成作品版本
Realistic Vision V5.1 创意工作流:利用GitHub管理提示词库与生成作品版本 你有没有遇到过这种情况?团队里每个人都在用Realistic Vision V5.1生成图片,但大家用的提示词五花八门,好的描述词散落在各个聊天记录里,生成…...
3个实用技巧:让Mermaid图表创作效率翻倍的秘密武器
3个实用技巧:让Mermaid图表创作效率翻倍的秘密武器 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程图…...
当心“Pin-to-Pin兼容“陷阱:ICM-42688国产替代芯片深度拆解与避坑指南
两句话总结:近期TDK ICM-42688-P价格暴涨至百元且一芯难求,立创商城上出现了华轩阳、Tokmas等"国产替代"。本文通过详细对比三家datasheet数据手册,揭示所谓"兼容"背后的软件陷阱与性能差异。结论可能出乎你意料…...
Tailscale打洞失败太慢?手把手教你用Docker部署derper自建中转,告别国际绕行
Tailscale网络优化实战:用Docker自建derper中转节点提升连接速度 Tailscale作为现代零配置组网工具,其基于WireGuard协议的P2P直连特性确实令人惊艳——直到你发现两台设备之间的打洞成功率只有60%,而剩余40%的流量不得不绕行官方位于海外的中…...
UniApp实战:如何安全高效地在安卓10+设备上实现本地数据存储(附权限配置避坑指南)
UniApp安卓10本地数据存储实战:权限配置与高性能方案设计 当你的UniApp在安卓10设备上突然无法保存用户配置时,控制台那行冰冷的"Permission denied"可能让整个开发团队陷入深夜加班。这不是简单的API调用问题,而是安卓存储机制变革…...
Wan2.2-I2V-A14B企业落地:汽车4S店车型介绍短视频自动化生产系统
Wan2.2-I2V-A14B企业落地:汽车4S店车型介绍短视频自动化生产系统 1. 项目背景与需求分析 汽车4S店每天需要为不同车型制作大量介绍视频,传统视频制作方式面临三大痛点: 人力成本高:专业视频团队制作单条视频成本约2000-5000元制…...
SDMatte+边缘精修效果展示:羽毛建模精度、纱布透光过渡、叶片脉络保留
SDMatte边缘精修效果展示:羽毛建模精度、纱布透光过渡、叶片脉络保留 1. 惊艳效果开场 想象一下这样的场景:你需要为一件羽毛饰品拍摄产品图,但无论怎么调整灯光和背景,羽毛边缘总是显得模糊不清;或者当你尝试抠出一…...
