node.js日志写入
一、先来看一下 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可以提出来,不喜勿喷