Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/maou-shonen/hono-pino
pino plugin for hono.js
https://github.com/maou-shonen/hono-pino
honojs logger pino
Last synced: 3 months ago
JSON representation
pino plugin for hono.js
- Host: GitHub
- URL: https://github.com/maou-shonen/hono-pino
- Owner: maou-shonen
- License: mit
- Created: 2024-06-17T04:27:01.000Z (8 months ago)
- Default Branch: main
- Last Pushed: 2024-09-25T07:18:11.000Z (5 months ago)
- Last Synced: 2024-10-04T22:10:52.447Z (4 months ago)
- Topics: honojs, logger, pino
- Language: TypeScript
- Homepage:
- Size: 555 KB
- Stars: 9
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Hono + Pino
[![npm version][npm-version-src]][npm-version-href]
[![npm downloads][npm-downloads-src]][npm-downloads-href]
[![bundle][bundle-src]][bundle-href]
[![Codecov][codecov-src]][codecov-href]
[![License][license-src]][license-href]A pino logger plugin for hono
This repository is inspired by [pino-http](https://github.com/pinojs/pino-http) and [nestjs-pino](https://github.com/iamolegga/nestjs-pino).
## Install
```bash
# npm
npm install hono-pino pino
# pnpm
pnpm add hono-pino pino
# bun
bun add hono-pino pino
```## Usage
```ts
import { Hono } from 'hono'
import { pinoLogger } from 'hono-pino'const app = new Hono()
.use(
pinoLogger({
pino: {level: "debug"}
}),
)
.get((c) => {
const { logger } = c.var;const token = c.req.header("Authorization") ?? "";
logger.debug({ token });const user = getAuthorizedUser(token);
logger.assign({ user });const posts = getPosts();
logger.assign({ posts });logger.setResMessage("Get posts success"); // optional
return c.text("");
});await app.request("/", {
headers: {
Authorization: "Bearer token",
},
});// output (formatted for easier reading)
{"level":20, "token":"Bearer token"}
{
"level": 30,
"msg": "Get posts success",
"user": {
"id": 1,
"name": "john"
},
"posts": [
{
"id": 1,
"title": "My first post"
},
{
"id": 2,
"title": "My second post"
}
],
"req": {
"headers": {
"authorization": "Bearer token"
},
"method": "GET",
"url": "/"
},
"reqId": 1,
"res": {
"headers": {},
"status": 200
},
"responseTime": 2
}
```## Example
see [examples](./examples/)
## Middleware Options
[full options](./src/types.ts)
```ts
export interface Options {
/**
* custom context key
* @description context key for hono, Must be set to literal string.
* @default "logger"
*/
contextKey?: ContextKey;/**
* a pino instance or pino options
*/
pino?: pino.Logger | pino.LoggerOptions | pino.DestinationStream;/**
* http request log options
*/
http?:
| false
| {
/**
* custom request id
* @description set to false to disable
* @default () => n + 1
*/
reqId?: false | (() => string);
/**
* custom on request bindings
* @default
* (c) => ({
* req: {
* url: c.req.path,
* method: c.req.method,
* headers: c.req.header(),
* },
* })
*/
onReqBindings?: (c: Context) => pino.Bindings;
/**
* custom on request level
* @default (c) => "info"
*/
onReqLevel?: (c: Context) => pino.Level;
/**
* custom on request message
* @description set to false to disable
* @default false // disable
*/
onReqMessage?: false | ((c: Context) => string);
/**
* custom on response bindings
* @default
* (c) => ({
* res: {
* status: c.res.status,
* headers: c.res.headers,
* },
* })
*/
onResBindings?: (c: Context) => pino.Bindings;
/**
* custom on response level
* @default (c) => c.error ? "error" : "info"
*/
onResLevel?: (c: Context) => pino.Level;
/**
* custom on response message
* @description set to false to disable
* @default (c) => c.error ? c.error.message : "Request completed"
*/
onResMessage?: false | ((c: Context) => string);
/**
* adding response time to bindings
* @default true
*/
responseTime?: boolean;
};
}
```### Logger method
```ts
class PinoLogger {
// Same as pino[logger level]
trace: pino.LogFn
debug: pino.LogFn
info: pino.LogFn
warn: pino.LogFn
error: pino.LogFn
fatal: pino.LogFn// Get bindings (object)
bindings(): pino.Bindings
// Reset bindings
resetBindings(): void
// Assign bindings (default shallow merge)
assign(
bindings: pino.Bindings
opts?: {
/** deep merge */
deep?: boolean;
},
): void
}
```[npm-version-src]: https://img.shields.io/npm/v/hono-pino
[npm-version-href]: https://npmjs.com/package/hono-pino
[npm-downloads-src]: https://img.shields.io/npm/dm/hono-pino
[npm-downloads-href]: https://npmjs.com/package/hono-pino
[codecov-src]: https://img.shields.io/codecov/c/gh/maou-shonen/hono-pino/main
[codecov-href]: https://codecov.io/gh/maou-shonen/hono-pino
[bundle-src]: https://img.shields.io/bundlephobia/minzip/hono-pino
[bundle-href]: https://bundlephobia.com/result?p=hono-pino
[license-src]: https://img.shields.io/github/license/maou-shonen/hono-pino.svg
[license-href]: https://github.com/maou-shonen/hono-pino/blob/main/LICENSE