Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ scripts
**/node_modules
**/build
**/dist
**/tsconfig.tsbuildinfo

# Core package artifacts
# Hardhat files
Expand Down
26 changes: 26 additions & 0 deletions .github/workflows/cd-logger.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Logger NPM publish

permissions:
contents: read

on:
workflow_dispatch:

jobs:
logger-publish:
name: Logger NPM Publish
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: yarn
- name: Install dependencies
run: yarn install --immutable
- name: Build logger package
run: yarn build:logger
- name: Publish package
run: yarn workspace @human-protocol/logger npm publish --access public
env:
YARN_NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
Comment thread
github-advanced-security[bot] marked this conversation as resolved.
Fixed
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
"lint": "yarn workspaces foreach --all -p run lint",
"build:core": "yarn workspace @human-protocol/core build",
"build:sdk": "yarn workspace @human-protocol/sdk build",
"build:libs": "yarn build:core && yarn build:sdk",
"build:logger": "yarn workspace @human-protocol/logger build",
"build:libs": "yarn build:core && yarn build:sdk && yarn build:logger",
"docker:infra-up": "make -C ./docker-setup -f Makefile.dev infra-up",
"docker:infra-stop": "make -C ./docker-setup -f Makefile.dev infra-stop",
"docker:infra-down": "make -C ./docker-setup -f Makefile.dev infra-down",
Expand Down
1 change: 1 addition & 0 deletions packages/apps/reputation-oracle/server/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ COPY ${APP_PATH}/package.json ./${APP_PATH}/
# so we need to copy and build them
COPY packages/core ./packages/core
COPY packages/sdk ./packages/sdk
COPY packages/libs ./packages/libs

RUN yarn install

Expand Down
3 changes: 1 addition & 2 deletions packages/apps/reputation-oracle/server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
},
"dependencies": {
"@human-protocol/core": "workspace:*",
"@human-protocol/logger": "workspace:*",
"@human-protocol/sdk": "workspace:*",
"@nestjs/axios": "^3.1.3",
"@nestjs/common": "^10.2.7",
Expand Down Expand Up @@ -62,7 +63,6 @@
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
"pg": "8.13.1",
"pino": "^9.6.0",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.2.0",
"typeorm": "^0.3.16",
Expand Down Expand Up @@ -91,7 +91,6 @@
"eslint-plugin-prettier": "^5.2.1",
"jest": "29.7.0",
"nock": "^14.0.3",
"pino-pretty": "^13.0.0",
"prettier": "^3.4.2",
"source-map-support": "^0.5.20",
"supertest": "^7.0.0",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export const SERVICE_NAME = 'reputation-oracle';
export const DATABASE_SCHEMA_NAME = 'hmt';
export const JWT_STRATEGY_NAME = 'jwt-http';

Expand Down
86 changes: 0 additions & 86 deletions packages/apps/reputation-oracle/server/src/logger/README.md

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Logger } from '../types';
import type { Logger } from '@human-protocol/logger';

const logger: Logger = {
child: () => logger,
Expand Down
8 changes: 4 additions & 4 deletions packages/apps/reputation-oracle/server/src/logger/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { createLogger } from './pino-logger';
import NestLogger from './nest-logger';
import { LogLevel } from './types';
import { createLogger, NestLogger, LogLevel } from '@human-protocol/logger';

import { SERVICE_NAME } from '../common/constants';
import Environment from '../utils/environment';

const isDevelopment = Environment.isDevelopment();
Expand All @@ -14,7 +14,7 @@ const defaultLogger = createLogger(
},
{
environment: Environment.name,
service: 'reputation-oracle',
service: SERVICE_NAME,
},
);

Expand Down
4 changes: 4 additions & 0 deletions packages/libs/logger/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"trailingComma": "all"
}
152 changes: 152 additions & 0 deletions packages/libs/logger/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
## HUMAN Protocol Node.js logger

Custom logger implementation for use in Node.js HUMAN Protocol apps.

Provides standartized API and writes logs in pre-defined JSON format:
```json
{
"level": "debug",
"message": "Some info about error",
"timestamp": 1738937400037,
"error": {
"kind": "CustomError",
"message": "Message from custom error",
"stack": "CustomError: Message from custom error\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)",
"customErrorProp": "error-detail-prop"
}
// ...merging meta
}
```

## Logger initialization and usage

### Pre-created logger instance
By defaul this library exports pre-created logger instance that you can start using immediately. This logger is pre-configured with:
- zero-bindings (only `name` is set up as `human-protocol-logger`)
- pretty-printing and structured log format
- has `debug` as its minimum level to log

To use it:
```ts
import logger from '@human-protocol/logger';

logger.info('Some message', { some: 'extras' });
```
It's expected to be used only in dev environments, such as a developer toolbox, some local scripts and etc.

### Create application logger with factory function

Lib exports `createLogger` factory function that should be used to create a logger intance with proper bindings for application. Recommended bindings are at least `service` and `environment`, so that you can distinguish logs coming from different sources in your log-management system easilly.

```ts
import { createLogger, LogLevel } from '@human-protocol/logger';

const ENV_NAME = process.NODE_ENV || 'development';
const isDevelopment = ENV_NAME === 'development';
const isTest = process.NODE_ENV === 'test'

const defaultAppLogger = createLogger(
{
name: 'DefaultLogger',
level: isDevelopment ? LogLevel.DEBUG : LogLevel.INFO,
pretty: isDevelopment,
disabled: isTest,
},
{
environment: ENV_NAME,
service: 'you-application-name',
},
);

export default defaultAppLogger;

// import it somewehre in your app and use
import logger from '<relative_path_to>/logger';

logger.info('Some application log', { with: 'useful-context' });
```

### Replacing default Nest.js logger
Once you have your application logger instance created, you can replace default Nest.js logger with it, so anything that comes from your appication follows the same format. This library provides a helper for that:

```ts
import { NestLogger } from '@human-protocol/logger';

// initialize an overridden instance
export const nestLoggerOverride = new NestLogger(
defaultAppLogger.child({ name: 'NestLogger' }),
);


// init you Nest.js app with overriden instance
const app = await NestFactory.create(AppModule, {
logger: nestLoggerOverride,
});

// Logger is `nestLoggerOverride` now
import { Logger } from '@nestjs/common';
```

## Usage examples
Logger has next API contract: log message first and any useful detail in log meta as a second argument.

:information_source: If meta is not a plain object and not an error - it is being logged as "meta" property

:information_source: Error formatting is done only for error argument and "error" context property.

```ts
// to log simple message
logger.info('Info without any context');

// to log message with some context info
loger.info('New user registered', {
userAgent,
country,
ip,
email,
});

// to log an error
logger.error('Something went wrong', error);

// or error with some extra context
logger.error('Error updating some entity', {
error,
entityId: 42,
...extra
});

// to log anything
logger.debug('Show me value', someValue);
```

If needed, you can create a named logger
```ts
const utilsLogger = logger.child({ name: 'UtilsLogger' })
// ....
utilsLogger.debug('input params', args);
/*
{
"level": "debug",
"logger": "UtilsLogger",
"message": "input params",
"timestamp": 1738937400037
...
}
*/
```
or bind a "context" (or any other) prop to it
```ts
const contextLogger = logger.child({ context: 'SomeClassOrMethod' })
// ....
contextLogger.info('Helpful info', context);
/*
{
"level": "debug",
"context": "SomeClassOrMethod",
"message": "Helpful info",
"timestamp": 1738937400037,
...
}
*/
```
Loading
Loading