Log4j2 之Patterns配置

本文详细介绍了Log4j2中PatternLayout的配置参数及转换模式,包括字符集、模式字符串、正则表达式替换等,以及如何使用各种转换模式如日期、异常堆栈、线程信息等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Log4j2 之Patterns配置

参见 https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

 

 

PatternLayout Parameters
Parameter NameTypeDescription
charsetStringThe character set to use when converting the syslog String to a byte array. The String must be a valid Charset. If not specified, this layout uses the platform default character set.
patternStringA composite pattern string of one or more conversion patterns from the table below. Cannot be specified with a PatternSelector.
patternSelectorPatternSelectorA component that analyzes information in the LogEvent and determines which pattern should be used to format the event. The pattern and patternSelector parameters are mutually exclusive.
replaceRegexReplacementAllows portions of the resulting String to be replaced. If configured, the replace element must specify the regular expression to match and the substitution. This performs a function similar to the RegexReplacement converter but applies to the whole message while the converter only applies to the String its pattern generates.
alwaysWriteExceptionsbooleanIf true (it is by default) exceptions are always written even if the pattern contains no exception conversions. This means that if you do not include a way to output exceptions in your pattern, the default exception formatter will be added to the end of the pattern. Setting this to false disables this behavior and allows you to exclude exceptions from your pattern output.
headerStringThe optional header string to include at the top of each log file.
footerStringThe optional footer string to include at the bottom of each log file.
disableAnsibooleanIf true (default is false), do not output ANSI escape codes.
noConsoleNoAnsibooleanIf true (default is false) and System.console() is null, do not output ANSI escape codes.

 

Conversion PatternDescription
c{precision}
logger{precision}

Outputs the name of the logger that published the logging event. The logger conversion specifier can be optionally followed by precision specifier, which consists of a decimal integer, or a pattern starting with a decimal integer.

When the precision specifier is an integer value, it reduces the size of the logger name. If the number is positive, the layout prints the corresponding number of rightmost logger name components. If negative, the layout removes the corresponding number of leftmost logger name components.

If the precision contains any non-integer characters, then the layout abbreviates the name based on the pattern. If the precision integer is less than one, the layout still prints the right-most token in full. By default, the layout prints the logger name in full.

Conversion PatternLogger NameResult
%c{1}org.apache.commons.FooFoo
%c{2}org.apache.commons.Foocommons.Foo
%c{10}org.apache.commons.Fooorg.apache.commons.Foo
%c{-1}org.apache.commons.Fooapache.commons.Foo
%c{-2}org.apache.commons.Foocommons.Foo
%c{-10}org.apache.commons.Fooorg.apache.commons.Foo
%c{1.}org.apache.commons.Fooo.a.c.Foo
%c{1.1.~.~}org.apache.commons.test.Fooo.a.~.~.Foo
%c{.}org.apache.commons.test.Foo....Foo
C{precision}
class{precision}

Outputs the fully qualified class name of the caller issuing the logging request. This conversion specifier can be optionally followed by precision specifier, that follows the same rules as the logger name converter.

Generating the class name of the caller (location information) is an expensive operation and may impact performance. Use with caution.

d{pattern}
date{pattern}

Outputs the date of the logging event. The date conversion specifier may be followed by a set of braces containing a date and time pattern string per SimpleDateFormat .

The predefined formats are DEFAULT, ABSOLUTE, COMPACT, DATE, ISO8601, and ISO8601_BASIC.

You can also use a set of braces containing a time zone id per java.util.TimeZone.getTimeZone. If no date format specifier is given then the DEFAULT format is used.

PatternExample
%d{DEFAULT}2012-11-02 14:34:02,123
%d{DEFAULT_MICROS}2012-11-02 14:34:02,123456
%d{DEFAULT_NANOS}2012-11-02 14:34:02,123456789
%d{ISO8601}2012-11-02T14:34:02,781
%d{ISO8601_BASIC}20121102T143402,781
%d{ABSOLUTE}14:34:02,781
%d{ABSOLUTE_MICROS}14:34:02,123456
%d{ABSOLUTE_NANOS}14:34:02,123456789
%d{DATE}02 Nov 2012 14:34:02,781
%d{COMPACT}20121102143402781
%d{HH:mm:ss,SSS}14:34:02,123
%d{HH:mm:ss,nnnn} to %d{HH:mm:ss,nnnnnnnnn}14:34:02,1234 to 14:34:02,123456789
%d{dd MMM yyyy HH:mm:ss,SSS}02 Nov 2012 14:34:02,123
%d{dd MMM yyyy HH:mm:ss,nnnn} to %d{dd MMM yyyy HH:mm:ss,nnnnnnnnn}02 Nov 2012 14:34:02,1234 to 02 Nov 2012 14:34:02,123456789
%d{HH:mm:ss}{GMT+0}18:34:02
%d{UNIX}1351866842
%d{UNIX_MILLIS}1351866842781

%d{UNIX} outputs the UNIX time in seconds. %d{UNIX_MILLIS} outputs the UNIX time in milliseconds. The UNIX time is the difference, in seconds for UNIX and in milliseconds for UNIX_MILLIS, between the current time and midnight, January 1, 1970 UTC. While the time unit is milliseconds, the granularity depends on the operating system (Windows). This is an efficient way to output the event time because only a conversion from long to String takes place, there is no Date formatting involved.

Log4j 2.11 adds limited support for timestamps more precise than milliseconds when running on Java 9. Note that not all DateTimeFormatter formats are supported. Only timestamps in the formats mentioned in the table above may use the "nano-of-second" pattern letter n instead of the "fraction-of-second" pattern letter S.

Users may revert back to a millisecond-precision clock when running on Java 9 by setting system property log4j2.Clock to SystemMillisClock.

enc{pattern}{[HTML|XML|JSON|CRLF]}
encode{pattern}{[HTML|XML|JSON|CRLF]}

Encodes and escapes special characters suitable for output in specific markup languages. By default, this encodes for HTML if only one option is specified. The second option is used to specify which encoding format should be used. This converter is particularly useful for encoding user provided data so that the output data is not written improperly or insecurely.

A typical usage would encode the message %enc{%m} but user input could come from other locations as well, such as the MDC %enc{%mdc{key}}

Using the HTML encoding format, the following characters are replaced:

CharacterReplacement
'\r', '\n'Converted into escaped strings "\\r" and "\\n" respectively
&, <, >, ", ', /Replaced with the corresponding HTML entity

Using the XML encoding format, this follows the escaping rules specified by the XML specification:

CharacterReplacement
&, <, >, ", 'Replaced with the corresponding XML entity

Using the JSON encoding format, this follows the escaping rules specified by RFC 4627 section 2.5:

CharacterReplacement
U+0000 - U+001F\u0000 - \u001F
Any other control charactersEncoded into its \uABCD equivalent escaped code point
"\"
\\\

For example, the pattern {"message": "%enc{%m}{JSON}"} could be used to output a valid JSON document containing the log message as a string value.

Using the CRLF encoding format, the following characters are replaced:

CharacterReplacement
'\r', '\n'Converted into escaped strings "\\r" and "\\n" respectively
equals{pattern}{test}{substitution}
equalsIgnoreCase{pattern}{test}{substitution}

Replaces occurrences of 'test', a string, with its replacement 'substitution' in the string resulting from evaluation of the pattern. For example, "%equals{[%marker]}{[]}{}" will replace '[]' strings produces by events without markers with an empty string.

The pattern can be arbitrarily complex and in particular can contain multiple conversion keywords.

ex|exception|throwable
{
  [ "none"
   | "full"
   | depth
   | "short"
   | "short.className"
   | "short.fileName"
   | "short.lineNumber"
   | "short.methodName"
   | "short.message"
   | "short.localizedMessage"]
}
  {filters(package,package,...)}
  {suffix(pattern)}
  {separator(separator)}

Outputs the Throwable trace bound to the logging event, by default this will output the full trace as one would normally find with a call to Throwable.printStackTrace().

You can follow the throwable conversion word with an option in the form %throwable{option}.

%throwable{short} outputs the first line of the Throwable.

%throwable{short.className} outputs the name of the class where the exception occurred.

%throwable{short.methodName} outputs the method name where the exception occurred.

%throwable{short.fileName} outputs the name of the class where the exception occurred.

%throwable{short.lineNumber} outputs the line number where the exception occurred.

%throwable{short.message} outputs the message.

%throwable{short.localizedMessage} outputs the localized message.

%throwable{n} outputs the first n lines of the stack trace.

Specifying %throwable{none} or %throwable{0} suppresses output of the exception.

Use {filters(packages)} where packages is a list of package names to suppress matching stack frames from stack traces.

Use {suffix(pattern)} to add the output of pattern at the end of each stack frames.

Use a {separator(...)} as the end-of-line string. For example: separator(|). The default value is the line.separator system property, which is operating system dependent.

F
file

Outputs the file name where the logging request was issued.

Generating the file information (location information) is an expensive operation and may impact performance. Use with caution.

highlight{pattern}{style}

Adds ANSI colors to the result of the enclosed pattern based on the current event's logging level. (See Jansi configuration.)

The default colors for each level are:

LevelANSI color
FATALBright red
ERRORBright red
WARNYellow
INFOGreen
DEBUGCyan
TRACEBlack (looks dark grey)

The color names are ANSI names defined in the AnsiEscape class.

The color and attribute names and are standard, but the exact shade, hue, or value.

Color table
Intensity Code01234567
NormalBlackRedGreenYellowBlueMagentaCyanWhite
BrightBlackRedGreenYellowBlueMagentaCyanWhite

You can use the default colors with:

%highlight{%d [%t] %-5level: %msg%n%throwable}

You can override the default colors in the optional {style} option. For example:

%highlight{%d [%t] %-5level: %msg%n%throwable}{FATAL=white, ERROR=red, WARN=blue, INFO=black, DEBUG=green, TRACE=blue}

You can highlight only the a portion of the log event:

%d [%t] %highlight{%-5level: %msg%n%throwable}

You can style one part of the message and highlight the rest the log event:

%style{%d [%t]}{black} %highlight{%-5level: %msg%n%throwable}

You can also use the STYLE key to use a predefined group of colors:

%highlight{%d [%t] %-5level: %msg%n%throwable}{STYLE=Logback}
The STYLE value can be one of:
StyleDescription
DefaultSee above
Logback
LevelANSI color
FATALBlinking bright red
ERRORBright red
WARNRed
INFOBlue
DEBUGNormal
TRACENormal
K{key}
map{key}
MAP{key}

Outputs the entries in a MapMessage, if one is present in the event. The K conversion character can be followed by the key for the map placed between braces, as in %K{clientNumber} where clientNumber is the key. The value in the Map corresponding to the key will be output. If no additional sub-option is specified, then the entire contents of the Map key value pair set is output using a format {{key1,val1},{key2,val2}}

l
location

Outputs location information of the caller which generated the logging event.

The location information depends on the JVM implementation but usually consists of the fully qualified name of the calling method followed by the callers source the file name and line number between parentheses.

Generating location information is an expensive operation and may impact performance. Use with caution.

L
line

Outputs the line number from where the logging request was issued.

Generating line number information (location information) is an expensive operation and may impact performance. Use with caution.

m{nolookups}{ansi}
msg{nolookups}{ansi}
message{nolookups}{ansi}

Outputs the application supplied message associated with the logging event.

Add {ansi} to render messages with ANSI escape codes (requires JAnsi, see configuration.)

The default syntax for embedded ANSI codes is:

  1. @|code(,code)*text|@

For example, to render the message "Hello" in green, use:

  1. @|green Hello|@

To render the message "Hello" in bold and red, use:

  1. @|bold,red Warning!|@

You can also define custom style names in the configuration with the syntax:

  1. %message{ansi}{StyleName=value(,value)*(StyleName=value(,value)*)*}%n

For example:

  1. %message{ansi}{WarningStyle=red,bold KeyStyle=white ValueStyle=blue}%n

The call site can look like this:

  1. logger.info("@|KeyStyle {}|@ = @|ValueStyle {}|@", entry.getKey(), entry.getValue());

Use {nolookups} to log messages like "${date:YYYY-MM-dd}" without using any lookups. Normally calling logger.info("Try ${date:YYYY-MM-dd}") would replace the date template ${date:YYYY-MM-dd} with an actual date. Using nolookups disables this feature and logs the message string untouched.

M
method

Outputs the method name where the logging request was issued.

Generating the method name of the caller (location information) is an expensive operation and may impact performance. Use with caution.

marker The full name of the marker, including parents, if one is present.
markerSimpleName The simple name of the marker (not including parents), if one is present.
maxLen
maxLength

Outputs the result of evaluating the pattern and truncating the result. If the length is greater than 20, then the output will contain a trailing ellipsis. If the provided length is invalid, a default value of 100 is used.

Example syntax: %maxLen{%p: %c{1} - %m%notEmpty{ =>%ex{short}}}{160} will be limited to 160 characters with a trailing ellipsis. Another example: %maxLen{%m}{20} will be limited to 20 characters and no trailing ellipsis.

n

Outputs the platform dependent line separator character or characters.

This conversion character offers practically the same performance as using non-portable line separator strings such as "\n", or "\r\n". Thus, it is the preferred way of specifying a line separator.

N
nano

Outputs the result of System.nanoTime() at the time the log event was created.

pid{[defaultValue]}
processId{[defaultValue]}

Outputs the process ID if supported by the underlying platform. An optional default value may be specified to be shown if the platform does not support process IDs.

variablesNotEmpty{pattern}
varsNotEmpty{pattern}
notEmpty{pattern}

Outputs the result of evaluating the pattern if and only if all variables in the pattern are not empty.

For example:

%notEmpty{[%marker]}
p|level{level=label, level=label, ...} p|level{length=n} p|level{lowerCase=true|false}

Outputs the level of the logging event. You provide a level name map in the form "level=value, level=value" where level is the name of the Level and value is the value that should be displayed instead of the name of the Level.

For example:

%level{WARN=Warning, DEBUG=Debug, ERROR=Error, TRACE=Trace, INFO=Info}

Alternatively, for the compact-minded:

%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I}

More succinctly, for the same result as above, you can define the length of the level label:

%level{length=1}
If the length is greater than a level name length, the layout uses the normal level name.

You can combine the two kinds of options:

%level{ERROR=Error, length=2}
This give you the Error level name and all other level names of length 2.

Finally, you can output lower-case level names (the default is upper-case):

%level{lowerCase=true}
r
relative
Outputs the number of milliseconds elapsed since the JVM was started until the creation of the logging event.
replace{pattern}{regex}{substitution}

Replaces occurrences of 'regex', a regular expression, with its replacement 'substitution' in the string resulting from evaluation of the pattern. For example, "%replace{%msg}{\s}{}" will remove all spaces contained in the event message.

The pattern can be arbitrarily complex and in particular can contain multiple conversion keywords. For instance, "%replace{%logger %msg}{\.}{/}" will replace all dots in the logger or the message of the event with a forward slash.

rEx|rException|rThrowable
  {
    ["none" | "short" | "full" | depth]
    [,filters(package,package,...)]
    [,separator(separator)]
  }
  {ansi(
    Key=Value,Value,...
    Key=Value,Value,...
    ...)
  }
  {suffix(pattern)}

The same as the %throwable conversion word but the stack trace is printed starting with the first exception that was thrown followed by each subsequent wrapping exception.

The throwable conversion word can be followed by an option in the form %rEx{short} which will only output the first line of the Throwable or %rEx{n} where the first n lines of the stack trace will be printed.

Specifying %rEx{none} or %rEx{0} will suppress printing of the exception.

Use filters(packages) where packages is a list of package names to suppress matching stack frames from stack traces.

Use a separator string to separate the lines of a stack trace. For example: separator(|). The default value is the line.separator system property, which is operating system dependent.

Use rEx{suffix(pattern) to add the output of pattern to the output only when there is a throwable to print.

sn
sequenceNumber
Includes a sequence number that will be incremented in every event. The counter is a static variable so will only be unique within applications that share the same converter Class object.
style{pattern}{ANSI style}

Uses ANSI escape sequences to style the result of the enclosed pattern. The style can consist of a comma separated list of style names from the following table. (See Jansi configuration.)

Style NameDescription
NormalNormal display
BrightBold
DimDimmed or faint characters
UnderlineUnderlined characters
BlinkBlinking characters
ReverseReverse video
Hidden 
Black or FG_BlackSet foreground color to black
Red or FG_RedSet foreground color to red
Green or FG_GreenSet foreground color to green
Yellow or FG_YellowSet foreground color to yellow
Blue or FG_BlueSet foreground color to blue
Magenta or FG_MagentaSet foreground color to magenta
Cyan or FG_CyanSet foreground color to cyan
White or FG_WhiteSet foreground color to white
Default or FG_DefaultSet foreground color to default (white)
BG_BlackSet background color to black
BG_RedSet background color to red
BG_GreenSet background color to green
BG_YellowSet background color to yellow
BG_BlueSet background color to blue
BG_MagentaSet background color to magenta
BG_CyanSet background color to cyan
BG_WhiteSet background color to white

For example:

%style{%d{ISO8601}}{black} %style{[%t]}{blue} %style{%-5level:}{yellow} %style{%msg%n%throwable}{green}

You can also combine styles:

%d %highlight{%p} %style{%logger}{bright,cyan} %C{1.} %msg%n

You can also use % with a color like %black, %blue, %cyan, and so on. For example:

%black{%d{ISO8601}} %blue{[%t]} %yellow{%-5level:} %green{%msg%n%throwable}
T
tid
threadId
Outputs the ID of the thread that generated the logging event.
t
tn
thread
threadName
Outputs the name of the thread that generated the logging event.
tp
threadPriority
Outputs the priority of the thread that generated the logging event.
fqcn Outputs the fully qualified class name of the logger.
endOfBatch Outputs the EndOfBatch status of the logging event, as "true" or "false".
x
NDC
Outputs the Thread Context Stack (also known as the Nested Diagnostic Context or NDC) associated with the thread that generated the logging event.
X{key[,key2...]}
mdc{key[,key2...]}
MDC{key[,key2...]}

Outputs the Thread Context Map (also known as the Mapped Diagnostic Context or MDC) associated with the thread that generated the logging event. The X conversion character can be followed by one or more keys for the map placed between braces, as in %X{clientNumber} where clientNumber is the key. The value in the MDC corresponding to the key will be output.

If a list of keys are provided, such as %X{name, number}, then each key that is present in the ThreadContext will be output using the format {name=val1, number=val2}. The key/value pairs will be printed in the order they appear in the list.

If no sub-options are specified then the entire contents of the MDC key value pair set is output using a format {key1=val1, key2=val2}. The key/value pairs will be printed in sorted order.

See the ThreadContext class for more details.

u{"RANDOM" | "TIME"}
uuid
Includes either a random or a time-based UUID. The time-based UUID is a Type 1 UUID that can generate up to 10,000 unique ids per millisecond, will use the MAC address of each host, and to try to insure uniqueness across multiple JVMs and/or ClassLoaders on the same host a random number between 0 and 16,384 will be associated with each instance of the UUID generator Class and included in each time-based UUID generated. Because time-based UUIDs contain the MAC address and timestamp they should be used with care as they can cause a security vulnerability.
xEx|xException|xThrowable
  {
    ["none" | "short" | "full" | depth]
    [,filters(package,package,...)]
    [,separator(separator)]
  }
  {ansi(
    Key=Value,Value,...
    Key=Value,Value,...
    ...)
  }
  {suffix(pattern)}

The same as the %throwable conversion word but also includes class packaging information.

At the end of each stack element of the exception, a string containing the name of the jar file that contains the class or the directory the class is located in and the "Implementation-Version" as found in that jar's manifest will be added. If the information is uncertain, then the class packaging data will be preceded by a tilde, i.e. the '~' character.

The throwable conversion word can be followed by an option in the form %xEx{short} which will only output the first line of the Throwable or %xEx{n} where the first n lines of the stack trace will be printed. Specifying %xEx{none} or %xEx{0} will suppress printing of the exception.

Use filters(packages) where packages is a list of package names to suppress matching stack frames from stack traces.

Use a separator string to separate the lines of a stack trace. For example: separator(|). The default value is the line.separator system property, which is operating system dependent.

The ansi option renders stack traces with ANSI escapes code using the JAnsi library. (See configuration.) Use {ansi} to use the default color mapping. You can specify your own mappings with key=value pairs. The keys are:

  • Prefix
  • Name
  • NameMessageSeparator
  • Message
  • At
  • CauseLabel
  • Text
  • More
  • Suppressed
  • StackTraceElement.ClassName
  • StackTraceElement.ClassMethodSeparator
  • StackTraceElement.MethodName
  • StackTraceElement.NativeMethod
  • StackTraceElement.FileName
  • StackTraceElement.LineNumber
  • StackTraceElement.Container
  • StackTraceElement.ContainerSeparator
  • StackTraceElement.UnknownSource
  • ExtraClassInfo.Inexact
  • ExtraClassInfo.Container
  • ExtraClassInfo.ContainerSeparator
  • ExtraClassInfo.Location
  • ExtraClassInfo.Version

The values are names from JAnsi's Code class like blue, bg_red, and so on (Log4j ignores case.)

The special key StyleMapName can be set to one of the following predefined maps: Spock, Kirk.

As with %throwable, the %xEx{suffix(pattern) conversion will add the output of pattern to the output only if there is a throwable to print.

% The sequence %% outputs a single percent sign.

转载于:https://www.cnblogs.com/8341-jack/p/9830126.html

log4j2是一个流行的Java日志框架,可以通过log4j2.xml文件进行配置。下面是log4j2.xml文件的配置详解: 1. 配置文件动态刷新配置 可以使用monitorInterval属性来设置配置文件的动态刷新间隔,单位为秒。例如: ```xml <Configuration monitorInterval="30"> ``` 2. Configuration的status属性 Configuration标签有一个status属性,用于指定日志记录器的状态。可以设置为debug、info、warn、error、fatal。例如: ```xml <Configuration status="warn"> ``` 3. 日志级别 可以使用属性level来指定日志级别,可以设置为trace、debug、info、warn、error、fatal、off。例如: ```xml <Logger name="com.foo.Bar" level="trace"> ``` 4. Logger与Root标签 Logger标签用于指定特定的类或包的日志级别,而Root标签用于指定所有日志记录器的默认日志级别。例如: ```xml <Root level="error"> <AppenderRef ref="Console"/> </Root> <Logger name="com.foo.Bar" level="trace"> <AppenderRef ref="RollingFile"/> </Logger> ``` 5. Logger的additivity属性 Logger标签还有一个additivity属性,用于指定是否将日志事件传递给父记录器。默认情况下,Logger的additivity属性为true。例如: ```xml <Logger name="com.foo.Bar" level="trace" additivity="false"> ``` 6. appender-ref的ref属性 可以使用appender-ref标签来引用appender。例如: ```xml <Logger name="com.foo.Bar" level="trace"> <AppenderRef ref="RollingFile"/> </Logger> ``` 7. appender 可以使用appender标签来指定日志输出的目的地,例如控制台或文件。常用的appender有Console、File、RollingFile等。例如: ```xml <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/> <Policies> <TimeBasedTriggeringPolicy/> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> </RollingFile> </Appenders> ``` 8. Patterns 可以使用PatternLayout标签来指定日志输出的格式。例如: ```xml <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> ``` 9. Java使用Log4j2 可以使用以下步骤在Java中使用Log4j2: 1)导入pom依赖 ```xml <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.14.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.14.1</version> </dependency> ``` 2配置Log4j2.xml 3)使用日志 ```java import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class MyClass { private static final Logger logger = LogManager.getLogger(MyClass.class); public void doSomething() { logger.debug("Debug message"); logger.info("Info message"); logger.warn("Warn message"); logger.error("Error message"); logger.fatal("Fatal message"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值