java分析nginx网站日志

自由开源,超高性能,免费的java分析nginx网站日志的工具,最终生成方便查看的网页版的网站监控报表。

自己用java分析nginx网站日志

先看效果图:
nginx网站分析工具

一,为什么不用第三方的网站日志分析工具

大家都熟悉的第三方的nginx网站日志分析工具,有收费的宝塔网站监控面板,有免费的goaccess和基于js的51la和百度网站统计等等。那为什么还要自己做一个网站日志分析工具呢?

  1. 第三方网站日志分析工具要么收费,要么不好用;
  2. 咱们自己做,可以根据自己的需要,对感兴趣的数据进行统计分析;
  3. 可以自己设计外观,自己喜欢什么风格就做成什么风格;
  4. 自己做不会泄露网站资料;

二,网站日志分析的基本原理

咱们nginx服务器生成的原始网站日志文件是一个文本文件,而且是非常有规律的格式化的文本文件,这样就便于我们对这个原始的网站日志文件进行处理。
第一步,就是生成结构化的数据:把原始日志文件的各个数据元素提取出来,放进sqlite数据库临时的网站统计表中。
第二步,在sqlite数据库的网站统计表中通过各种查询方法,统计出我们感兴趣的数据,把统计出的数据再存储到的sqlite数据库中的日志存档表中。
第三部,查询日志存档表,将查询结果以html网页的形式输出到网站根目录下,我们可以直接在浏览器中访问和查看。

三,下面介绍具体的算法和源代码

(一),创建sqlite数据库

package com.face1688;

import java.io.File;
import java.sql.*;

public class SHelper {
   
  public static String dbFilePath = "site_record.db";
  public static Connection cn;
  public static ResultSet rs;

  public static void connect() {
   
    try {
   
      File file = new File(dbFilePath);
      boolean exist = file.exists();
      if (!exist) {
   
        file.createNewFile();
      }
      Class.forName("org.sqlite.JDBC");
      cn = DriverManager.getConnection("jdbc:sqlite:" + dbFilePath);
      if (!exist)
        createTables();
      else
        readSettings();
    } catch (Exception e) {
   
      Log.error(e);
    }
  }

  /**
   * 数据库字段不能以数字开头。
   */
  public static void createTables() {
   
    try {
   
      //删除表和索引
      Statement ps = cn.createStatement();
      ps.executeUpdate("drop index if exists index_wztjb");
      ps.executeUpdate("drop table if exists wztjb");
      ps.executeUpdate("drop index if exists index_pzb");
      ps.executeUpdate("drop table if exists pzb");
      ps.executeUpdate("drop index if exists index_rzcdb");
      ps.executeUpdate("drop table if exists rzcdb");
      //新建表
      //配置表
      ps.executeUpdate("Create table pzb(name text primary key,myvalue blob)");
      //网站统计表
      ps.executeUpdate("Create table if not exists wztjb(id integer primary key autoincrement,date,time,ip,request,ret_code,ret_count,enter,client)");
      //索引
      ps.executeUpdate("Create index if not exists index_wztjb on wztjb(id,date,ip,ret_code,ret_count,enter,client)");
      //日志存档表
      ps.executeUpdate("Create table if not exists rzcdb(id integer primary key autoincrement,date,pv,uv,xzl,gjs,baiduspider,smspider,qihuspider,bingbot,googlebot)");
      //索引
      ps.executeUpdate("Create index if not exists index_rzcdb on rzcdb(id,date)");


    } catch (Exception e) {
   
      Log.error(e);
    }
  }

  /**
   * 复位网站统计表,删除后重建
   */
  public static void resetWztjb() {
   
    try {
   
      //删除表和索引
      Statement ps = cn.createStatement();
      ps.executeUpdate("drop table if exists wztjb");
      ps.executeUpdate("drop index if exists index_wztjb");
      //网站统计表
      ps.executeUpdate("Create table if not exists wztjb(id integer primary key autoincrement,date,time,ip,request,ret_code,ret_count,enter,client)");
      //索引
      ps.executeUpdate("Create index if not exists index_wztjb on wztjb(id,date,ip,ret_code,ret_count,enter,client)");

    } catch (Exception e) {
   
      Log.error(e);
    }
  }

  //region 读取配置
  public static void readSettings() {
   

    try {
   
      PreparedStatement ps = cn.prepareStatement("select name,myvalue from pzb");
      rs = ps.executeQuery();
      String name;
      while (rs.next()) {
   
        name = rs.getString(1);
        byte[] b = rs.getBytes(2);
        switch (name) {
   
          case "lastRow"://最新统计到的行号
            ServerSettings.lastRow = BitConverter.toInt(b, 0);
            break;
          case "minutes"://间隔分钟
            ServerSettings.minutes = BitConverter.toInt(b, 0);
            if(ServerSettings.minutes ==0)ServerSettings.minutes = 5;
            break;
          default:
            break;
        }

      }
      rs.close();
    } catch (Exception e) {
   
      Log.error(e);
    }
    //加载默认设置

  }

  private static void UpdateSettingsByName(String name, byte[] value) {
   
    try {
   
      PreparedStatement ps = cn.prepareStatement("insert or replace into pzb values(?,?)");
      ps.setString(1, name);
      ps.setBytes(2, value);
      ps.executeUpdate();
    } catch (Exception e) {
   
      Log.info(e.getMessage());
    }
  }

  private static void Write(String name, byte[] value) {
   
    UpdateSettingsByName(name, value);
  }

  public static void SaveSettingsByName(String name, String value) {
   
    byte[] bv = value.getBytes();
    Write(name, bv);
  }

  public static void SaveSettingsByName(String name, int value) {
   
    byte[] bv = BitConverter.getBytes(value);
    Write(name, bv);
  }
}

(二),核心分析代码

package com.face1688;

import java.io.*;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;

public class Main {
   
    public static boolean appRun = true;
    public static int startTime;
    public static boolean busy = false;
    static PreparedStatement psInsert;

    public static void main(String[] args) throws Exception {
   
        SHelper.connect();
        psInsert = SHelper.cn.prepareStatement("insert into wztjb(date,time,ip,request,ret_code,ret_count,enter,client) values(?,?,?,?,?,?,?,?)");
        startTime = ServerTime.getShortTime();
        Log.info("日志分析服务正在运行");
        new Thread(new Runnable() {
   
            public void run() {
   
                while (appRun) {
   
                    try {
   
                        busy = true;
                        SHelper.cn.setAutoCommit(false);
                        readFromLine(ServerSettings.lastRow);
                        saveSiteLog();
                        updateHtmlReport();
                        SHelper.cn.commit();
                        Log.info("更新完成");
                        busy = false;
                        Thread.sleep(1000 * ServerSettings.minutes*60);//更新频率,10分钟,随便设置
                        //Thread.sleep(1000 * 10);//更新频率,10分钟,随便设置

                    } catch (Exception e) {
   
                        Log.info(e.getMessage());
                        busy = false;
                        break;
                    }
                }
            }
        }).start();

        Controller.run();//显示控制台
    }

    /**
     *
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网站出现502 java nginx的错误是指在访问网站时,服务器返回了502错误状态码。这个错误通常是由于服务器代理或网关出现问题引起的。 首先,502错误是一种HTTP状态码,通常表示服务器充当网关或代理服务器时,从上游服务器(如Java应用服务器)收到无效的响应。在这种情况下,Java应用服务器作为上游服务器与nginx网关进行通信,然后再将响应传递给客户端。 造成502错误的原因可能有多种。首先,Java应用服务器可能没有正确的响应或返回了错误的响应,导致nginx网关无法处理。这可能是由于应用程序中的错误、配置问题或资源不足等问题引起的。 另外,服务器之间的通信也可能出现问题,如连接超时、断开连接、负载过高等。这些问题可能会导致nginx无法从Java应用服务器获得有效的响应。 为了解决502错误,可以尝试以下几种方法: 1. 检查应用程序的日志和错误信息,查找可能的问题。尝试重新启动应用程序,查看是否可以解决问题。 2. 检查nginxJava应用服务器的配置。确保它们之间的通信正常并且正确配置。可以尝试更改一些配置选项,以解决问题。 3. 如果负载过高,可以尝试增加服务器的资源(如CPU、内存)或优化服务器配置,以提高性能。 4. 如果502错误只是偶尔出现,可以尝试刷新页面或等待一段时间,看看问题是否会自行解决。 总的来说,502 java nginx错误是由服务器代理或网关出现问题引起的。通过检查应用程序的日志、配置文件和服务器资源,可以尝试找出问题的原因并采取相应的措施来解决这个错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值