【Spring Boot、Log4j2】Spring Boot 整合 Log4j2日志框架

一、Spring Boot 整合 Log4j2日志框架(简单使用)

1、修改Pom.xml依赖

 		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

2、在resource下新建log4j2.xml文件(默认文件)

控制台输出日志(简单)

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="WARN" monitorInterval="60">
    <!-- 配置 -->
    <Properties>
        <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}=时间,%-5level=日志等级,${sys:PID}=进程PID,[%t]=线程名称,%l=类、方法、日志行,%msg=消息,%n=换行-->
        <Property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${sys:PID} --- [%t] %l ::: %msg%n"/>
        <!-- 日志目录-->
        <Property name="APP_LOG_ROOT" value="D:\project_log\manage_system\"/>
    </Properties>

    <Appenders>
        <!-- 输出控制台日志的配置 -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
    </Appenders>
    <Loggers>
        <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
        <!-- level:日志输出级别,共有8个级别,按照从高到低为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
        <Root level="INFO">
            <!-- AppenderRef:用来指定该日志输出到哪个Appender -->
            <AppenderRef ref="console"/>
        </Root>
    </Loggers>
</Configuration>

效果
在这里插入图片描述

如果不使用默认名,需要在application.yml内加入如下配置:

logging:
  config: classpath:log4j2-dev.xml

二、Log4j2日志框架(入门)官网地址

1、相关文档推荐

Log4j 2.x–Pattern Layout配置详解及示例
log4j2配置属性详解

2、log4j2.xml入门配置。注:滚动配置只有产生日志后,才会触发滚动机制

日志输出到文件中
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="WARN" monitorInterval="60">
    <!-- 配置 -->
    <Properties>
        <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}=时间,%-5level=日志等级,${sys:PID}=进程PID,[%t]=线程名称,%l=类、方法、日志行,%msg=消息,%n=换行-->
        <Property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${sys:PID} --- [%t] %l ::: %msg%n"/>
        <!-- 日志目录-->
        <Property name="APP_LOG_ROOT" value="D:\project_log\manage_system\"/>
    </Properties>

    <Appenders>
        <!-- 输出控制台日志的配置 -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <File name="fileLog" fileName="${APP_LOG_ROOT}/file.log">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>
    </Appenders>
    <Loggers>
        <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
        <!-- level:日志输出级别,共有8个级别,按照从高到低为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
        <Root level="INFO">
            <!-- AppenderRef:用来指定该日志输出到哪个Appender -->
            <AppenderRef ref="console"/>
            <AppenderRef ref="fileLog"/>
        </Root>
    </Loggers>
</Configuration>

在这里插入图片描述

日志输出到文件中(按时间间隔滚动,本配置使用的是按秒)
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="WARN" monitorInterval="60">
    <!-- 配置 -->
    <Properties>
        <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}=时间,%-5level=日志等级,${sys:PID}=进程PID,[%t]=线程名称,%l=类、方法、日志行,%msg=消息,%n=换行-->
        <Property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${sys:PID} --- [%t] %l ::: %msg%n"/>
        <!-- 日志目录-->
        <Property name="APP_LOG_ROOT" value="D:\project_log\manage_system\"/>
    </Properties>

    <Appenders>
        <!-- 输出控制台日志的配置 -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <File name="fileLog" fileName="${APP_LOG_ROOT}/file.log">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>

        <!-- 输出info日志到文件(滚动) -->
        <RollingFile name="infoLog"
                     fileName="${APP_LOG_ROOT}/info.log"
                     filePattern="${APP_LOG_ROOT}/info-%d{yyyy-MM-dd_HH-mm-ss}.log">

            <PatternLayout pattern="${LOG_PATTERN}"/>

            <!-- 记录INFO以上的日志 -->
            <ThresholdFilter level="INFO"/>
            <!-- 只记录INFO的日志 -->
<!--            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->

            <!-- 指定滚动日志的策略,就是什么时候进行新建日志文件输出日志 -->
            <Policies>
                <!-- interval属性用来指定多久滚动一次 -->
                <TimeBasedTriggeringPolicy interval="1"/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
        <!-- level:日志输出级别,共有8个级别,按照从高到低为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
        <Root level="INFO">
            <!-- AppenderRef:用来指定该日志输出到哪个Appender -->
            <AppenderRef ref="console"/>
            <AppenderRef ref="fileLog"/>
            <AppenderRef ref="infoLog"/>
        </Root>
    </Loggers>
</Configuration>

在这里插入图片描述

日志输出到文件中(按时间间隔+文件大小滚动,本配置使用的是按秒+KB)
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="WARN" monitorInterval="60">
    <!-- 配置 -->
    <Properties>
        <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}=时间,%-5level=日志等级,${sys:PID}=进程PID,[%t]=线程名称,%l=类、方法、日志行,%msg=消息,%n=换行-->
        <Property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${sys:PID} --- [%t] %l ::: %msg%n"/>
        <!-- 日志目录-->
        <Property name="APP_LOG_ROOT" value="D:\project_log\manage_system\"/>
    </Properties>

    <Appenders>
        <!-- 输出控制台日志的配置 -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <File name="fileLog" fileName="${APP_LOG_ROOT}/file.log">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>

        <!-- 输出info日志到文件(滚动) -->
        <RollingFile name="infoLog"
                     fileName="${APP_LOG_ROOT}/info.log"
                     filePattern="${APP_LOG_ROOT}/info-%d{yyyy-MM-dd_HH-mm-ss}-%i.log">

            <PatternLayout pattern="${LOG_PATTERN}"/>

            <!-- 记录INFO以上的日志 -->
            <ThresholdFilter level="INFO"/>
            <!-- 只记录INFO的日志 -->
<!--            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->

            <!-- 指定滚动日志的策略,就是什么时候进行新建日志文件输出日志 -->
            <Policies>
                <!-- interval属性用来指定多久滚动一次 -->
                <TimeBasedTriggeringPolicy interval="5"/>
                <!-- 指定大小,超过后创建新文件 -->
                <SizeBasedTriggeringPolicy size="1KB"/>
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
        <!-- level:日志输出级别,共有8个级别,按照从高到低为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
        <Root level="INFO">
            <!-- AppenderRef:用来指定该日志输出到哪个Appender -->
            <AppenderRef ref="console"/>
            <AppenderRef ref="fileLog"/>
            <AppenderRef ref="infoLog"/>
        </Root>
    </Loggers>
</Configuration>

在这里插入图片描述

日志输出到文件中(保留指定文件数量,使用%i实现)
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="ALL" monitorInterval="60">
    <!-- 配置 -->
    <Properties>
        <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}=时间,%-5level=日志等级,${sys:PID}=进程PID,[%t]=线程名称,%l=类、方法、日志行,%msg=消息,%n=换行-->
        <Property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${sys:PID} --- [%t] %l ::: %msg%n"/>
        <!-- 日志目录-->
        <Property name="APP_LOG_ROOT" value="D:\project_log\manage_system\"/>
    </Properties>

    <Appenders>
        <!-- 输出控制台日志的配置 -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <File name="fileLog" fileName="${APP_LOG_ROOT}/file.log">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>

        <!-- 输出info日志到文件(滚动) -->
        <RollingFile name="infoLog"
                     fileName="${APP_LOG_ROOT}/info.log"
                     filePattern="${APP_LOG_ROOT}/info-%d{yyyy-MM-dd_HH-mm}-%i.log">

            <PatternLayout pattern="${LOG_PATTERN}"/>

            <!-- 记录INFO以上的日志 -->
            <ThresholdFilter level="INFO"/>
            <!-- 只记录INFO的日志 -->
<!--            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->

            <!-- 指定滚动日志的策略,就是什么时候进行新建日志文件输出日志 -->
            <Policies>
                <!-- 指定大小,超过后创建新文件 -->
                <SizeBasedTriggeringPolicy size="1KB"/>
            </Policies>

            <!-- 用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)-->
            <DefaultRolloverStrategy max="5" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
        <!-- level:日志输出级别,共有8个级别,按照从高到低为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
        <Root level="INFO">
            <!-- AppenderRef:用来指定该日志输出到哪个Appender -->
            <AppenderRef ref="console"/>
            <AppenderRef ref="fileLog"/>
            <AppenderRef ref="infoLog"/>
        </Root>
    </Loggers>
</Configuration>

在这里插入图片描述

日志输出到文件中(保留指定范围内的文件,以下配置保留10s内的日志)
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="ALL" monitorInterval="60">
    <!-- 配置 -->
    <Properties>
        <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}=时间,%-5level=日志等级,${sys:PID}=进程PID,[%t]=线程名称,%l=类、方法、日志行,%msg=消息,%n=换行-->
        <Property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${sys:PID} --- [%t] %l ::: %msg%n"/>
        <!-- 日志目录-->
        <Property name="APP_LOG_ROOT" value="D:\project_log\manage_system\"/>
    </Properties>

    <Appenders>
        <!-- 输出控制台日志的配置 -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <File name="fileLog" fileName="${APP_LOG_ROOT}/file.log">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>

        <!-- 输出info日志到文件(滚动) -->
        <RollingFile name="infoLog"
                     fileName="${APP_LOG_ROOT}/info.log"
                     filePattern="${APP_LOG_ROOT}/info-%d{yyyy-MM-dd_HH-mm-ss}-%i.log">

            <PatternLayout pattern="${LOG_PATTERN}"/>

            <!-- 记录INFO以上的日志 -->
            <ThresholdFilter level="INFO"/>
            <!-- 只记录INFO的日志 -->
<!--            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->

            <!-- 指定滚动日志的策略,就是什么时候进行新建日志文件输出日志 -->
            <Policies>
                <!-- interval属性用来指定多久滚动一次 -->
                <TimeBasedTriggeringPolicy interval="2"/>
                <!-- 指定大小,超过后创建新文件 -->
                <SizeBasedTriggeringPolicy size="1MB"/>
            </Policies>

            <!-- 用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)-->
            <DefaultRolloverStrategy>
                <!-- basePath:目录位置 -->
                <!-- maxDepth:要访问的目录的最大级别数。值 0 表示仅访问起始文件(基本路径本身),除非安全管理器拒绝。Integer.MAX_VALUE 的值表示应该访问所有级别。默认值为 1,表示仅指定基目录中的文件。 -->
                <Delete basePath="${APP_LOG_ROOT}" maxDepth="1">
                    <!-- glob:如果未指定正则表达式,则为必需。使用类似于正则表达式但语法更简单的有限模式语言匹配相对路径(相对于基本路径)-->
                    <IfFileName glob="*\info-*.log"/>
                    <!-- age:必需的。指定持续时间。该条件接受与指定持续时间一样旧或更早的文件 -->
                    <!-- https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/rolling/action/Duration.html#parseCharSequence -->
                    <IfLastModified age="PT10S"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
        <!-- level:日志输出级别,共有8个级别,按照从高到低为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
        <Root level="INFO">
            <!-- AppenderRef:用来指定该日志输出到哪个Appender -->
            <AppenderRef ref="console"/>
            <AppenderRef ref="fileLog"/>
            <AppenderRef ref="infoLog"/>
        </Root>
    </Loggers>
</Configuration>

在这里插入图片描述
age配置:
在这里插入图片描述

单独指定日志的形式,比如要为指定包下的class指定不同的日志级别
<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<Configuration status="ALL" monitorInterval="60">
    <!-- 配置 -->
    <Properties>
        <!-- %d{yyyy-MM-dd HH:mm:ss.SSS}=时间,%-5level=日志等级,${sys:PID}=进程PID,[%t]=线程名称,%l=类、方法、日志行,%msg=消息,%n=换行-->
        <Property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level ${sys:PID} --- [%t] %l ::: %msg%n"/>
        <!-- 日志目录-->
        <Property name="APP_LOG_ROOT" value="D:\project_log\manage_system\"/>
    </Properties>

    <Appenders>
        <!-- 输出控制台日志的配置 -->
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <File name="fileLog" fileName="${APP_LOG_ROOT}/file.log">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>

        <!-- 输出info日志到文件(滚动) -->
        <RollingFile name="infoLog"
                     fileName="${APP_LOG_ROOT}/info.log"
                     filePattern="${APP_LOG_ROOT}/info-%d{yyyy-MM-dd_HH-mm-ss}-%i.log">

            <PatternLayout pattern="${LOG_PATTERN}"/>

            <!-- 记录INFO以上的日志 -->
            <ThresholdFilter level="INFO"/>
            <!-- 只记录INFO的日志 -->
<!--            <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>-->

            <!-- 指定滚动日志的策略,就是什么时候进行新建日志文件输出日志 -->
            <Policies>
                <!-- interval属性用来指定多久滚动一次 -->
                <TimeBasedTriggeringPolicy interval="2"/>
                <!-- 指定大小,超过后创建新文件 -->
                <SizeBasedTriggeringPolicy size="1MB"/>
            </Policies>

            <!-- 用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)-->
            <DefaultRolloverStrategy>
                <!-- basePath:目录位置 -->
                <!-- maxDepth:要访问的目录的最大级别数。值 0 表示仅访问起始文件(基本路径本身),除非安全管理器拒绝。Integer.MAX_VALUE 的值表示应该访问所有级别。默认值为 1,表示仅指定基目录中的文件。 -->
                <Delete basePath="${APP_LOG_ROOT}" maxDepth="1">
                    <!-- glob:如果未指定正则表达式,则为必需。使用类似于正则表达式但语法更简单的有限模式语言匹配相对路径(相对于基本路径)-->
                    <IfFileName glob="*\info-*.log"/>
                    <!-- age:必需的。指定持续时间。该条件接受与指定持续时间一样旧或更早的文件 -->
                    <!-- https://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/rolling/action/Duration.html#parseCharSequence -->
                    <IfLastModified age="PT10S"/>
                </Delete>
            </DefaultRolloverStrategy>
        </RollingFile>
    </Appenders>
    <Loggers>
        <!-- Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 -->
        <!-- level:日志输出级别,共有8个级别,按照从高到低为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
        <Root level="INFO">
            <!-- AppenderRef:用来指定该日志输出到哪个Appender -->
            <AppenderRef ref="console"/>
            <AppenderRef ref="fileLog"/>
            <AppenderRef ref="infoLog"/>
        </Root>

        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"/>
        <logger name="org.mybatis" level="INFO"/>
        <!-- Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等-->
        <!-- level:日志输出级别,共有8个级别,按照从高到低为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
        <!-- name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.-->
        <!-- additivity:additivity="false"只在自定义的Appender中进行输出,默认true-->
        <Logger name="com.**.config.**CacheScheduler" additivity="false">
            <!-- AppenderRef:用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出。-->
            <AppenderRef ref="console"/>
        </Logger>
    </Loggers>
</Configuration>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值