All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scouter.server.logs.RequestLogger Maven / Gradle / Ivy

There is a newer version: 2.20.0
Show newest version
/*
 *  Copyright 2015 the original author or authors. 
 *  @https://github.com/scouter-project/scouter
 *
 *  Licensed under the Apache License, Version 2.0 (the "License"); 
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License. 
 */

package scouter.server.logs;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.HashSet;
import java.util.Set;

import scouter.server.Configure;
import scouter.server.LoginManager;
import scouter.server.LoginUser;
import scouter.net.RequestCmd;
import scouter.util.DateUtil;
import scouter.util.FileUtil;
import scouter.util.RequestQueue;
import scouter.util.ThreadUtil;

public class RequestLogger extends Thread {

	private static final String FILE_PREFIX = "request";
	private static final String DIRECTORY = Configure.getInstance().log_dir;
	private static RequestLogger instance;
	public static Set cmdSet = new HashSet();
	public static Set demandSet = new HashSet();

	static {
		cmdSet.add(RequestCmd.SERVER_DB_DELETE);
		cmdSet.add(RequestCmd.REMOTE_CONTROL);
		cmdSet.add(RequestCmd.REMOTE_CONTROL_ALL);
		cmdSet.add(RequestCmd.TRANX_LOAD_TIME_GROUP);
		demandSet.add(RequestCmd.ACTIVE_QUERY_LIST);
	}

	public static synchronized RequestLogger getInstance() {
		if (instance == null) {
			instance = new RequestLogger();
			instance.setDaemon(true);
			instance.setName(ThreadUtil.getName(instance));
			instance.start();
		}
		return instance;
	}

	private RequestQueue queue = new RequestQueue(1000);

	public boolean add(String cmd, long session) {
		if (cmdSet.contains(cmd)) {
			LoginUser loginUser = LoginManager.getUser(session);
			if (loginUser != null) {
				queue.put(new RequestInfo(System.currentTimeMillis(), loginUser.id(), loginUser.ip(), cmd));
				return true;
			} else {
				queue.put(new RequestInfo(System.currentTimeMillis(), "unknown" + session, "", cmd));
				return false;
			}
		}
		return false;
	}

	boolean running = true;

	public void run() {
		while (running) {
			RequestInfo r = queue.get();
			BufferedWriter bw = null;
			try {
				File file = getFile();

				bw = new BufferedWriter(new FileWriter(file, true));
				bw.write(r.toString());
				bw.newLine();
				// bw.flush();
			} catch (Throwable e) {
				outFile=null;
				e.printStackTrace();
			} finally {
				FileUtil.close(bw);
			}
		}
	}

	private long dateUnit;
	private File outFile;

	private File getFile() {
		if (outFile == null || dateUnit != DateUtil.getDateUnit()) {
			String filename = FILE_PREFIX + "-" + DateUtil.yyyymmdd()+ ".log";
			outFile = new File(DIRECTORY, filename);
			File parentDir = new File(DIRECTORY);
			if (parentDir.exists() == false) {
				parentDir.mkdirs();
			}
		}
		return outFile;
	}

	public synchronized void registerCmd(String cmd) {
		if (cmdSet.contains(cmd) || demandSet.contains(cmd)) {
			return;
		}
		cmdSet.add(cmd);
		queue.put(new RequestInfo(System.currentTimeMillis(), "unknown", "register", cmd));
	}

	class RequestInfo {
		long time;
		String user;
		String ip;
		String cmd;

		RequestInfo(long time, String user, String ip, String cmd) {
			this.time = time;
			this.user = user;
			this.ip = ip;
			this.cmd = cmd;
		}

		public String toString() {
			return DateUtil.timestamp(this.time) + " " + this.user + "(" + this.ip + ") "
					+ cmd;
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy