node.js 日志文件的目录创建 、内容写入:fs.writeFile()和writerStream两种方法

一、先来看一下 fs

1、fs中常用的flag

这是菜鸟教程的截图:
菜鸟教程

2、比较常见的参数

path:文件的路径;
options :参数是一个对象
flag:标识位;
mode:权限位;
fd:文件描述符,需要先使用 open 打开;
buffer:要将内容读取到的 Buffer;
offset:整数,向 Buffer 写入的初始位置;
length:整数,读取文件的长度;
position:整数,读取文件初始位置;
callback:回调函数。

二、创建目录 fs.mkdir()

1、参数:(来自菜鸟教程)

path - 文件路径。
options 参数可以是:
recursive - 是否以递归的方式创建目录,默认为 false。
mode - 设置目录权限,默认为 0777。
callback - 回调函数,没有参数。

2、我们这里用日期来创建目录
const fs=require('fs');
const moment=require('moment');//获取日期的插件
const path=require('path');

//获取日期然后拼接目录
let Dir=path.join(__dirname,`./log/${moment().format('YYYYMMDD')}`);
//创建目录
function create_access(){
	//自己定义的文件
		let directory=Dir+'/access.log'
		fs.mkdirSync(Dir,{
			//是否使用递归创建目录
			recursive:true
		})
}

效果图
在这里插入图片描述
access.log这里放的是基本的访问信息;err.log则是异常信息

三、使用fs.writeFile() 写入日志

journal.js

//写入文件信息---基本的信息access.log
//write_log的参数是数据,路径
//正常情况的话;log文件都是多个的为了方便文件名用参数代替
function write_log(data,path){
	//先确认文件是否存在
	if(path=='access.log'){
		create_access();
	}else if (path=='err.log'){
		create_err();
	}

	let directory=Dir+'/'+path;
	//flag:'a'是追加的文件内容;追加之后记得换行
	fs.writeFile(directory,data, {flags: 'a'}, function (err,data) {
		if(err){
			write_log(err+'\n','err.log');
		}
	    console.log('追加成功')
	});
}
//暴露出去
module.exports={
	write_log
}

server.js

const http=require('http');
const fs=require('fs');
const moment=require('moment');
const { write_log } =require('./journal.js')

http.createServer(function(req,res){
		//头部
		res.writeHead(200,{'content-type':'text/html;charset=utf-8'});
		
		//方法,访问地址,浏览器特性,访问时间
		let log=req.method+' -- '+req.url+' -- '+req.headers['user-agent']+' -- '+moment().format('YYYY-MM-DD HH:mm:ss')+'\n';
		write_log(log,'access.log');
		// write_stream(log,'access.log');
		res.write('你好');
		res.end();

}).listen(8082);
console.log('http://127.0.0.1:8082')

运行结果:
在这里插入图片描述

四、writerStream 流 写入日志

journal.js

//用流写入

function write_stream(data,path){
	//先确认文件是否存在
	if(path=='access.log'){
		create_access();
	}else if (path=='err.log'){
		create_err();
	}

	// 创建一个可以追加的流,写入到文件
	var writerStream = fs.createWriteStream(Dir+'/'+path,{
		flags: 'a'
	});

// 使用 utf8 编码写入数据
	writerStream.write(data,'UTF8');

// 标记文件末尾
	writerStream.end();

// 处理流事件 --> data, end, and error
	writerStream.on('finish', function() {
		console.log("追加完成。");
	});
//异常处理
	writerStream.on('error', function(err){
		write_stream(err+'\n','err.log');
		console.log(err.stack);
	});
}

//暴露出去
module.exports={
	write_stream
}

server.js和上面的一样;只是修改了方法,效果也是一样的

五、源码

journal.js

const fs=require('fs');
const moment=require('moment');
const path=require('path');

let Dir=path.join(__dirname,`./log/${moment().format('YYYYMMDD')}`);
//创建目录
function create_access(){
	//自己定义的文件
		let directory=Dir+'/access.log'
		fs.mkdirSync(Dir,{
			//递归创建目录
			recursive:true
		})
}

function create_err(){
	//自己定义的文件
	let directory=Dir+'/err.log'
	fs.mkdirSync(Dir,{
		//递归创建目录
		recursive:true
	})
}


//写入文件信息---基本的信息access.log
//write_log的参数是数据,路径
//正常情况的话;log文件都是多个的为了方便文件名用参数代替
function write_log(data,path){
	//先确认文件是否存在
	if(path=='access.log'){
		create_access();
	}else if (path=='err.log'){
		create_err();
	}

	let directory=Dir+'/'+path;
	//flag:'a'是追加的文件内容
	fs.writeFile(directory,data, {flag: 'a'}, function (err,data) {
		if(err){
			write_log(err+'\n','err.log');
		}
	    console.log('追加成功')
	});
}



//用流写入

function write_stream(data,path){
	//先确认文件是否存在
	if(path=='access.log'){
		create_access();
	}else if (path=='err.log'){
		create_err();
	}

	// 创建一个可以追加的流,追加到文件中
	var writerStream = fs.createWriteStream(Dir+'/'+path,{
		flags: 'a'
	});

// 使用 utf8 编码写入数据
	writerStream.write(data,'UTF8');

// 标记文件末尾
	writerStream.end();

// 处理流事件 --> data, end, and error
	writerStream.on('finish', function() {
		console.log("追加完成。");
	});

	writerStream.on('error', function(err){
		write_stream(err+'\n','err.log');
		console.log(err.stack);
	});
}
module.exports={
	write_log,
	write_stream,
}

server.js

const http=require('http');
const moment=require('moment');
const { write_log,write_stream } =require('./journal.js')

http.createServer(function(req,res){
		//头部
		res.writeHead(200,{'content-type':'text/html;charset=utf-8'});

		//方法,访问地址,浏览器特性,访问时间
		let log=req.method+' -- '+req.url+' -- '+req.headers['user-agent']+' -- '+moment().format('YYYY-MM-DD HH:mm:ss')+'\n';
		// 第一种方法
		write_log(log,'access.log');
		// 第二种方法
		write_stream(log,'access.log');
		
		res.write('你好');
		res.end();

}).listen(8082);
console.log('http://127.0.0.1:8082')

菜鸟教程链接

初来乍到,如果有什么问题或者bug可以提出来,不喜勿喷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值