jar包运行及日志

第一章 JAR包基础与创建

1.1 JAR包结构解析

JAR(Java Archive)文件本质上是基于ZIP格式的打包文件,包含:

  • 编译后的.class文件
  • 资源文件(如配置文件、图片等)
  • META-INF/MANIFEST.MF清单文件

// 示例项目结构
src/
├── main/
│   ├── java/
│   │   └── com/
│   │       └── example/
│   │           └── App.java
│   └── resources/
│       └── config.properties
 

1.2 使用Maven打包

pom.xml

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.example.App</mainClass>
            </manifest>
          </archive>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

通过mvn package命令生成可执行JAR包,包含主类配置信息。

第二章 JAR包运行方式

2.1 基础运行命令

# 运行普通JAR包(指定主类) java -cp my-app.jar com.example.App

# 运行可执行JAR(包含Main-Class) java -jar my-app.jar

# 带参数运行 java -jar my-app.jar arg1 arg2

2.2 运行时配置

# 内存配置 java -Xms256m -Xmx1024m -jar my-app.jar

# 系统属性设置 java -Dconfig.path=/etc/myapp/config.properties -jar my-app.jar

# 调试模式 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar my-app.jar

第三章 日志系统集成

3.1 Log4j2配置示例

log4j2.xml

xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <File name="File" fileName="logs/app.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10"/>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="RollingFile"/>
        </Root>
        <Logger name="com.example" level="debug" additivity="false">
            <AppenderRef ref="File"/>
        </Logger>
    </Loggers>
</Configuration>

已完成

3.2 SLF4J+Logback配置

logback.xml

<configuration>
    <appender name="STDOUT" 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="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/application.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logs/archived/application-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>30</maxHistory>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

已完成

第四章 高级运行管理

4.1 Spring Boot JAR运行

# 标准运行 java -jar spring-boot-app.jar

# 指定Profile java -Dspring.profiles.active=prod -jar spring-boot-app.jar

# 外部配置覆盖 java -jar spring-boot-app.jar --server.port=8081

# 调试模式 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=n -jar spring-boot-app.jar

4.2 服务化运行脚本

run.sh

#!/bin/bash

JAR_NAME="my-app.jar"
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
LOG_DIR="./logs"
PID_FILE="$LOG_DIR/app.pid"

mkdir -p $LOG_DIR

start() {
    if [ -f $PID_FILE ]; then
        echo "Application is already running"
        exit 1
    fi
    
    nohup java $JAVA_OPTS -jar $JAR_NAME >> $LOG_DIR/console.log 2>&1 &
    echo $! > $PID_FILE
    echo "Application started with PID $(cat $PID_FILE)"
}

stop() {
    if [ ! -f $PID_FILE ]; then
        echo "Application is not running"
        exit 1
    fi
    
    kill $(cat $PID_FILE)
    rm $PID_FILE
    echo "Application stopped"
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

已完成

第五章 日志分析与监控

5.1 日志查询命令

# 实时查看日志 tail -f logs/app.log

# 查找错误日志 grep "ERROR" logs/app.log

# 按时间范围查询 sed -n '/2023-05-01 10:00/,/2023-05-01 11:00/p' logs/app.log

# 统计错误次数 grep -c "ERROR" logs/app.log

5.2 ELK日志收集配置

logstash.conf

input {
    file {
        path => "/path/to/your/logs/app.log"
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}

filter {
    grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{DATA:thread}\] %{LOGLEVEL:loglevel} %{DATA:logger} - %{GREEDYDATA:message}" }
    }
    date {
        match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
        target => "@timestamp"
    }
}

output {
    elasticsearch {
        hosts => ["localhost:9200"]
        index => "app-logs-%{+YYYY.MM.dd}"
    }
    stdout {
        codec => rubydebug
    }
}

已完成

第六章 实战案例

6.1 多模块项目打包

pom.xml

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>parent-project</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>
    
    <modules>
        <module>core</module>
        <module>web</module>
    </modules>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.example.MainApp</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

已完成

6.2 自定义日志处理器

CustomLogger.java

 org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class CustomLogger {
    private static final Logger logger = LoggerFactory.getLogger(CustomLogger.class);
    
    public void processBusiness() {
        logger.trace("Detailed trace information");
        logger.debug("Debug level information");
        logger.info("Business process started");
        
        try {
            // 业务逻辑
            logger.info("Processing item: {}", 123);
        } catch (Exception e) {
            logger.error("Error processing business", e);
            throw new RuntimeException(e);
        }
        
        logger.info("Business process completed");
    }
    
    public static void main(String[] args) {
        CustomLogger app = new CustomLogger();
        app.processBusiness();
    }
}

### Java运行JAR日志输出配置 当通过`java -jar`命令运行JAR时,可以通过多种方式配置日志的生成和查看方法。以下是几种常见的做法: #### 方法一:使用重定向操作符将日志写入文件 如果希望将日志保存到特定文件中而不是控制台显示,则可以利用Shell中的重定向功能。例如,在Linux环境下执行如下命令可完成此目标[^2]: ```bash java -jar your-application.jar > /path/to/application.log 2>&1 ``` 这里>`>`表示标准输出流被重新导向至指定路径下的log文件;而`2>&1`意味着错误消息也会一同记录下来。 #### 方法二:借助nohup命令并设置日志位置 对于需要长时间运行的服务进程而言,“nohup”是一个非常实用的选择因为它可以让程序即使在用户退出登录之后仍然保持活跃状态。下面展示了一个典型例子[^4]: ```bash nohup java -jar xxxxx.jar >> /custom/path/for/logs/output.log 2>&1 & ``` 上述语句不仅实现了后台模式启动应用还指定了自定义目录用于存储产生的所有信息(括正常打印以及异常堆栈追踪等内容)。 #### 方法三:基于Spring Boot应用程序内部定义Logger规则 如果是采用像Spring Framework这样的框架构建起来的应用项目的话,那么往往已经内置支持灵活调整logging level等功能特性了。只需要编辑application.properties或者application.yml文件即可达成目的[^3]: **application.properties** ```properties logging.file.name=/var/log/myapp.log logging.level.root=INFO ``` **application.yml** ```yaml logging: file: name: "/var/log/myapp.log" level: root: INFO ``` 以上两种形式均能有效设定最终生成的日志文档存放地址及其对应的最低级别阈值要求等参数选项。 --- ### 注意事项 无论采取哪种方案都需要注意权限管理问题,确保所选路径具有足够的读写权利以免发生意外情况影响整个系统的稳定性表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值