pm2 status error 解决

 Nodejs, pm2  pm2 status error 解决已关闭评论
2月 202019
 

今天使用pm2  启动nodejs应用, 发现启动一会儿,pm2 中status状态就从online变成error, 日志也看没有什么记录, 后来发现可以通过下面的步骤解决:  pm2 update

如果彻底些,可以先kill 掉pm2的进程, 再执行pm2 update命令。

查看帮助

$ pm2 update -h

  Usage: update [options]

  (alias) update in-memory PM2 with local PM2

  Options:

    -h, –help  output usage information

通过上面命令查看,估计问题出在本机PM2的内存数据里

nodejs 中使用log4js

 Nodejs  nodejs 中使用log4js已关闭评论
6月 152017
 

转自:http://blog.csdn.net/heiantianshi1/article/details/43984601

因为log4js-node从log4js移植而来,两者并不属于同一个模块,也有很多区别,下面为了区分和防止误解统一使用“log4js-node”这个名称,注意nodejs代码中引入模块时还是要用“require(‘log4js’)”。

1. 快速开始
1.1. 简单终端log
先看一下使用log4js-node 最简单的代码:
运行的结果如下:
首先log4js-node将输出的log分为六个的level,每个level的含义从字面就可以看出, 对于不同的level,log输出到终端时会使用不同的颜色(trace: 蓝色,debug: 青色, info:绿色,warn:黄色,error:红色, fatal:粉色)。终端是log4js-node的默认输出地点。
默认情况下,log4js-node的每条log输出格式有如下几个字段:日志产生时间,level,日志分类,日志内容。如果用户没有配置,日志分类字段为“default”。
1.2. 文件log
代码:
运行结果如下:
这个例子当中我们将日志存储到文件当中,并进行文件分割,具体的日志tag(或category)使用文件名。
2. 基本配置和基本分类

代码,注意用户需要先在项目目录下创建名为“logs”的目录:
终端结果:
__dirname/logs/login.log文件中输出结果,其中__dirname是项目根目录:
__dirname/logs/signup.log文件中得输出结果:
代码中我们调用了log4js-node的configure函数,该函数中我们传入了一个json对象,json对象中我们为log4js-node指定了三个appender,分别是一个终端和两个文件。我们也为两个文件appender指定了存储文件路径,和分类,路径决定了每个appender输出的log所存储文件的位置和名称,分类对应于前文提到的日志输出格式的分类字段。一个appender相当于一个日志输出目标,该目标决定了对应日志的输出格式,存储位置等。
指定不同的appender后,我们在调用log4js-node的getLogger()时需要指定对应的appedner的分类名,比如“getLogger(‘login’)”, 如果不指定默认为输出到终端的appender。
我们还可以以配置文件的方式来提供配置,只需要将文件路径传给log4js-node的configure的函数即可,效果一样。上面的配置我们改为以下实现方式,首先我们在项目的根目录下新创建一个“conf”目录(这里的名称可以根据自己的情况随意取),然后将如下配置内容存到conf目录下,并命名为“log4js_conf.json”(这里的文件名称也可以随便取,但后缀名要为.json):
然后我们将之前代码中的log4js.configure()调用语句改为:log4js.configure(__dirname + ‘/conf/log4js_conf.json’)。运行后结果与前面相同。注意文件配置时, filename对应的路径默认从app的根目录开始。
到这里,我们已经能够将日志进行分类输出,并存储到不同的文件当中,这已经能够满足一般的业务需求了。但是,如果我们想定制日志的输出格式该怎么办呢?另外,目前日志虽然分到不同的文件中,但是每个文件都是无限增长的,话句话说如果日志足够多的话,我们的单个日志文件将会非常大,这为我们打开日志文件和分析日志增加了难度,如何才能解决这个问题呢?这些问题我们将在后文种做详细介绍。
3. 高级设置
3.1. 为log设置不同的level
设置log level有两种主要的方式,一种是在代码中通过调用每个logger的setLevel函数,另外一种是在配置文件中加入levels选项。首先看第一种,我们为之前的两个logger“loginLogger4js”和“signupLogger4js”分别调用setLevel函数,具体如下:
终端输出结果如下:
然后我们将第一种方式的setLevel函数调用去掉,换用第二种方式,在之前的配置文件“log4js_conf.json”中加入level配置选项如下:
终端的输出结果如下,与第一种方式相同:
当然我们还可以,直接设置全局的level,这样我们就不用为每个logger单独配置了,如果全局配置和具体logger的配置同时存在,那么log4js-node会以具体logger的配置为准。全局level也是两种方式:代码中和文件中。首先看前者,我们将之前的每个logger的level配置代码都去掉,然后再代码中加入如下一句:
运行结果如下:
第二种全局level配置方式,我们把配置文件“log4js_conf.json”内容改为如下:
运行结果如下:
3.2. 将日志文件分开存储
这个配置并不是使用所有的appender的,比如在console就是不需要的,这里只讨论appender 的type为’file’的情况。首先我们看一下log4js内置的file appender的初始化函数:
从注释中我们就可以看书第三个参数“logSize”和第四个参数“numBackups”决定了是否要分割日志文件,每个日志文件的最大容量,以及最大的文件数。这两个参数对应于配置中的“maxLogSize”和“backups”选项, 前者单位是bytes, 后者单位是个。接着前面的例子,我们在将配置文件改为如下内容(后面内容我们统一用配置文件的方式):
生成的日志备份如下:
若果超出了总大小旧的文件会被覆盖掉。
3.3. http log
安装后log4js-node代码中自带一个“example-connect-logger.js”例子,它展示了如何使用log4js输出http log。这里不再赘述,不过要说明一下如何定制输出格式。
首先看源码中关于connect-logger.js中getLogger函数的注释:
/**

 * Log requests with the given `options` or a `format` string.
 *
 * Options:
 *
 *   – `format`        Format string, see below for tokens
 *   – `level`         A log4js levels instance. Supports also ‘auto’
 *
 * Tokens:
 *
 *   – `:req[header]` ex: `:req[Accept]`
 *   – `:res[header]` ex: `:res[Content-Length]`
 *   – `:http-version`
 *   – `:response-time`
 *   – `:remote-addr`
 *   – `:date`
 *   – `:method`
 *   – `:url`
 *   – `:referrer`
 *   – `:user-agent`
 *   – `:status`
 *
 * @param {String|Function|Object} format or options
 * @return {Function}
 * @api public

 */
从注释中我们可以知道有哪些token可以用来定制我们自己的输出格式,这里只举出一个例子来说明。这个例子是比较精简的,主要用来调试,具体如下:
var HTTP_LOG_FORMAT_DEV = ‘:method :url :status :response-time ms – :res[content-length]’;
app.use(log4js.connectLogger(logger, { level: ‘auto’, format: HTTP_LOG_FORMAT_DEV }));
其中的一个输出结果为:
[2014-12-30 11:48:35.784] [ERROR] log4jslog -GET /users 404 4 ms – 18

nodejs中使用yargs 模块处理命令行参数

 Nodejs  nodejs中使用yargs 模块处理命令行参数已关闭评论
6月 152017
 

yargs 模块

shelljs 只解决了如何调用 shell 命令,而 yargs 模块能够解决如何处理命令行参数。它也需要安装。

$ npm install --save yargs

yargs 模块提供 argv 对象,用来读取命令行参数。请看改写后的 hello 。

#!/usr/bin/env node var argv = require('yargs').argv; console.log('hello ', argv.name); 

使用时,下面两种用法都可以。

$ hello --name=tom
hello tom

$ hello --name tom
hello tom

也就是说,process.argv 的原始返回值如下。

$ node hello --name=tom [ 'node', '/path/to/myscript.js', '--name=tom' ] 

yargs 可以上面的结果改为一个对象,每个参数项就是一个键值对。

var argv = require('yargs').argv;  // $ node hello --name=tom // argv = { //   name: tom // }; 

如果将 argv.name 改成 argv.n,就可以使用一个字母的短参数形式了。

$ hello -n tom
hello tom

可以使用 alias 方法,指定 name 是 n 的别名。

#!/usr/bin/env node var argv = require('yargs') .alias('n', 'name') .argv; console.log('hello ', argv.n); 

这样一来,短参数和长参数就都可以使用了。

$ hello -n tom
hello tom
$ hello --name tom
hello tom

argv 对象有一个下划线(_)属性,可以获取非连词线开头的参数。

#!/usr/bin/env node var argv = require('yargs').argv; console.log('hello ', argv.n); console.log(argv._); 

用法如下。

$ hello A -n tom B C
hello  tom [ 'A', 'B', 'C' ] 

yargs命令行参数的配置

yargs 模块还提供3个方法,用来配置命令行参数。

  • demand:是否必选
  • default:默认值
  • describe:提示
#!/usr/bin/env node var argv = require('yargs') .demand(['n']) .default({n: 'tom'}) .describe({n: 'your name'}) .argv; console.log('hello ', argv.n); 

上面代码指定 n 参数不可省略,默认值为 tom,并给出一行提示。

options 方法允许将所有这些配置写进一个对象。

#!/usr/bin/env node var argv = require('yargs') .option('n', { alias : 'name', demand: true, default: 'tom', describe: 'your name', type: 'string' }) .argv; console.log('hello ', argv.n); 

有时,某些参数不需要值,只起到一个开关作用,这时可以用 boolean 方法指定这些参数返回布尔值。

#!/usr/bin/env node var argv = require('yargs') .boolean(['n']) .argv; console.log('hello ', argv.n); 

上面代码中,参数 n 总是返回一个布尔值,用法如下。

$ hello
hello false $ hello -n
hello true $ hello -n tom
hello true 

boolean 方法也可以作为属性,写入 option 对象。

#!/usr/bin/env node var argv = require('yargs') .option('n', { boolean: true }) .argv; console.log('hello ', argv.n); 

yargs帮助信息

yargs 模块提供以下方法,生成帮助信息。

  • usage:用法格式
  • example:提供例子
  • help:显示帮助信息
  • epilog:出现在帮助信息的结尾
#!/usr/bin/env node var argv = require('yargs') .option('f', { alias : 'name', demand: true, default: 'tom', describe: 'your name', type: 'string' }) .usage('Usage: hello [options]') .example('hello -n tom', 'say hello to Tom') .help('h') .alias('h', 'help') .epilog('copyright 2015') .argv; console.log('hello ', argv.n); 

执行结果如下。

$ hello -h

Usage: hello [options] Options: -f, --name  your name [string] [required] [default: "tom"] -h, --help  Show help [boolean] Examples: hello -n tom  say hello to Tom

copyright 2015 

yargs子命令

yargs 模块还允许通过 command 方法,设置 Git 风格的子命令。

#!/usr/bin/env node var argv = require('yargs') .command("morning", "good morning", function (yargs) { console.log("Good Morning"); }) .command("evening", "good evening", function (yargs) { console.log("Good Evening"); }) .argv; console.log('hello ', argv.n); 

用法如下。

$ hello morning -n tom
Good Morning
hello tom

可以将这个功能与 shellojs 模块结合起来。

#!/usr/bin/env node require('shelljs/global'); var argv = require('yargs') .command("morning", "good morning", function (yargs) { echo("Good Morning"); }) .command("evening", "good evening", function (yargs) { echo("Good Evening"); }) .argv; console.log('hello ', argv.n); 

每个子命令往往有自己的参数,这时就需要在回调函数中单独指定。回调函数中,要先用 reset 方法重置 yargs 对象。

#!/usr/bin/env node require('shelljs/global'); var argv = require('yargs') .command("morning", "good morning", function (yargs) { echo("Good Morning"); var argv = yargs.reset() .option("m", { alias: "message", description: "provide any sentence" }) .help("h") .alias("h", "help") .argv; echo(argv.m); }) .argv; 

用法如下。

$ hello morning -m "Are you hungry?" Good Morning
Are you hungry?

转自:http://www.ruanyifeng.com/blog/2015/05/command-line-with-node.html

11月 052013
 

1、建议在根目录下新建一个目录 /down,用来保存下载的文件

# mkdir /down

cd /down

2、安装 node.js 相关软件

A:首先要安装 gcc gcc-g++ openssl-devel  

# yum install gcc gcc-g++ openssl-devel


B: 如未找到make,使用下面命令

# yum -y install gcc automake autoconf libtool make

C: 如make过程提示g++命令未找到,执行下面:

安装g++:

# yum install gcc gcc-c++

C: 我们会wget文件,如没有wget命令,可使用下面安装:

# yum install wget

 3、下载 python 2.7

#wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz

解压安装

#tar zxvf Python-2.7.3.tgz

#cd Python-2.7.3

#./configure && make && make install 

4、下载 node.js 解压 安装

# cd /down

# wget http://nodejs.org/dist/v0.8.6/node-v0.8.6.tar.gz

tar zxvf node-v0.8.14.tar.gz

# cd node-v0.8.14

./configure && make && make install

这里可能需要几分钟时间,make install注意使用有对应权限的用户

最终看到  updating shebang of /usr/local/bin/npm to /usr/local/bin/node

就说明安装成功了

# node –version 可查看目前版本

NodeJS ——-NPM的使用

 Nodejs  NodeJS ——-NPM的使用已关闭评论
2月 272013
 

NPM是一个Node包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。有了NPM,可以很快的找到特定服务要使用的包,进行下载、安装以及管理已经安装的包。

NPM常用的命令有:

(1)$ npm install moduleNames

安装Node模块

注意事项:如果在使用模块的时候不知道其名字,可以通过http://search.npmjs.org网站按照

索引值找到想要的模块。npm也提供了查询的功能  $ npm search indexName

安装完毕后会产生一个node_modules目录,其目录下就是安装的各个node模块。

node的安装分为全局模式和本地模式。一般情况下会以本地模式运行,包会被安装

到和你的应用代码统计的本地node_modules目录下。在全局模式下,Node包会被

安装到Node的安装目录下的node_modules下。全局安装命令为

$ npm install -g moduleName。获知使用$npm set global=true来设定安装模式

,$npm get global可以查看当前使用的安装模式。

(2)$ npm view moduleNames

查看node模块的package.json文件夹

注意事项:如果想要查看package.json文件夹下某个标签的内容,可以使用

$ npm view moduleName labelName

(3)$ npm list

查看当前目录下已安装的node包

注意事项:Node模块搜索是从代码执行的当前目录开始的,搜索结果取决于当前使用的目录中

的node_modules下的内容。$ npm list parseable=true可以目录的形式来展现当

前安装的所有node包

(4)$ npm help

查看帮助命令

(5)$ npm view moudleName dependencies

查看包的依赖关系

(6)$ npm view moduleName repository.url

查看包的源文件地址

(7)$ npm view moduleName engines

查看包所依赖的Node的版本

(8)$npm help folders

查看npm使用的所有文件夹

(9)$ npm rebuild moduleName

用于更改包内容后进行重建

(10)$ npm outdated

检查包是否已经过时,此命令会列出所有已经过时的包,可以及时进行包的更新

(11)$ npm update moduleName

更新node模块

(12)$ npm uninstall moudleName

卸载node模块

(13)一个npm包是包含了package.json的文件夹,package.json描述了这个文件夹的结构。访

问npm的json文件夹的方法如下:

$ npm help json

此命令会以默认的方式打开一个网页,如果更改了默认打开程序则可能不会以网页的形式打

开。

(14)发布一个npm包的时候,需要检验某个包名是否已存在

$ npm search packageName