The Logger in Java and Android

在面向对象的世界里,我们可以将对象拟人化。它们不仅拥有资源(数据),还能实现一些功能(方法)。Logger就是Java自带的,Android也支持的一个可以将log信息写到控制台或文件的log信息记录员。

package org.vhow.android;

import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;

public class AppMain {

	public static void main(String[] args) throws SecurityException,
			IOException {
		// Create a Logger whose name is "AppMain"
		Logger aLogger = Logger.getLogger(AppMain.class.getName());

		// This Logger object will records all kinds of logs.
		aLogger.setLevel(Level.ALL);

		// Write logging message to Console.
		sentLogMessageToConsole(aLogger);

		// Writer logging message to a File.
		sentLogMessageToFile(aLogger);

		// Log a message.
		aLogger.log(Level.INFO, "info");

	}

	private static void sentLogMessageToConsole(Logger aLogger) {
		// A ConsoleHandler object can publish records to System.err.
		ConsoleHandler aConsoleHandler = new ConsoleHandler();

		// All kinds of logs will be logged by this handler.
		aConsoleHandler.setLevel(Level.ALL);

		// Format LogRecords for this Handler.
		aConsoleHandler.setFormatter(new LogRecordFormatter());

		// Add the ConsoleHanler object to receive the logging messages.
		aLogger.addHandler(aConsoleHandler);
	}

	private static void sentLogMessageToFile(Logger aLogger) throws IOException {
		// A FileHandler object can writer log message to a file.
		FileHandler aFileHandler = new FileHandler("logs.log");

		// All kinds of logs will be logged by this handler
		aFileHandler.setLevel(Level.ALL);

		// / Add the FileHandler object to receive the logging messages.
		aLogger.addHandler(aFileHandler);
	}

}
我们还需要一个定义log record格式的类

package org.vhow.android;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

class LogRecordFormatter extends Formatter {
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	Date date;

	@Override
	public String format(LogRecord record) {
		date = new Date(record.getMillis());
		return dateFormat.format(date) + ", " + record.getSourceClassName()
				+ ", " + record.getSourceMethodName() + ", "
				+ record.getLevel() + ": " + record.getMessage() + "\n";
	}

}
如果我们不规定log信息的格式,则默认的打到控制台的log格式如下:

默认写到文件中的log格式如下:


java.lang.Throwable: Assertion failed: Network must not be accessed in EDT or inside read action, because this may take considerable amount of time, and write actions will be blocked during that time so user won't be able to perform tasks in the IDE at com.intellij.openapi.diagnostic.Logger.assertTrue(Logger.java:258) at com.intellij.util.io.HttpRequests.process(HttpRequests.java:497) at com.intellij.util.io.HttpRequests$RequestBuilderImpl.connect(HttpRequests.java:335) at com.android.tools.idea.sdk.StudioDownloader.doDownloadFully(StudioDownloader.java:219) at com.android.tools.idea.sdk.StudioDownloader.downloadFully(StudioDownloader.java:147) at com.android.tools.idea.sdk.StudioDownloader.downloadFully(StudioDownloader.java:277) at com.android.tools.idea.sdk.StudioDownloader.downloadAndStreamWithOptions(StudioDownloader.java:137) at com.android.tools.idea.sdk.StudioDownloader.downloadAndStream(StudioDownloader.java:131) at com.android.repository.impl.sources.RemoteListSourceProviderImpl.getSources(RemoteListSourceProviderImpl.java:138) at com.android.repository.impl.manager.RemoteRepoLoaderImpl.fetchPackages(RemoteRepoLoaderImpl.java:102) at com.android.repository.impl.manager.RepoManagerImpl$LoadTask.run(RepoManagerImpl.java:615) at com.android.repository.api.RepoManager$DummyProgressRunner.runSyncWithProgress(RepoManager.java:417) at com.android.repository.impl.manager.RepoManagerImpl.load(RepoManagerImpl.java:415) at com.android.repository.impl.manager.RepoManagerImpl.loadSynchronously(RepoManagerImpl.java:300) at com.android.repository.api.RepoManager.loadSynchronously(RepoManager.java:296) at com.android.tools.idea.sdk.wizard.legacy.LicenseAgreementStep.createChangesList(LicenseAgreementStep.java:252) at com.android.tools.idea.sdk.wizard.legacy.LicenseAgreementStep.initUI(LicenseAgreementStep.java:207) at com.android.tools.idea.sdk.wizard.legacy.LicenseAgreementStep.<init>(LicenseAgreementStep.java:117) at com.android.tools.idea.sdk.wizard.
10-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值