
Research
Two Malicious Rust Crates Impersonate Popular Logger to Steal Wallet Keys
Socket uncovers malicious Rust crates impersonating fast_log to steal Solana and Ethereum wallet keys from source code.
@chiper-inc/logging-chiper
Advanced tools
This simple module offers a way to use some functionalities from the logging-chiper.
As company we want to standardize the way we log our application, so that's we wrote this module to make it easier to log our application.
npm i logging-chiper -S -E
OR
yarn add logging-chiper -S -E
To initialize the logger you need call the init
function at start point of your application, using the following parameters:
// import the class from the library
import { Logger } from "logging-chiper";
Logger.init({
projectId: "your-project-id",
service: "your-service-name",
version: "0.0.1",
});
As we want to standardize the way we log our application, so we defined a base structure as input parameters to accomplish this:
// Log method
Logger.getInstance().log({
stt: "my-stt", // name of the stt owner
context: "my-context", // name of the class or file (optional)
functionName: "my-function", // name of the function (optional)
message: "my-message", // message to log
data: {
// data to log (optional)
storeId: "" + 123456,
responseCode: "" + 200,
testField: "test",
extraField: "extra",
},
});
// Warn method
Logger.getInstance().warn({
stt: "my-stt", // name of the stt owner
context: "my-context", // name of the class or file (optional)
functionName: "my-function", // name of the function (optional)
message: "my-message", // message to log
data: {
// data to log (optional)
storeId: "" + 123456,
responseCode: "" + 200,
testField: "test",
extraField: "extra",
},
});
// Error method
Logger.getInstance().error({
stt: "my-stt", // name of the stt owner
context: "my-context", // name of the class or file (optional)
functionName: "my-function", // name of the function (optional)
message: "my-message", // message to log
error, // the exception to log that just occurred
data: {
// data to log (optional)
storeId: "" + 123456,
responseCode: "" + 200,
testField: "test",
extraField: "extra",
},
});
As you can see, all the methods follows almost the same structure, but when you want to log an error, you need to pass the error as parameter.
import { Logger } from 'logging-chiper';
const bootstrap = () => {
Logger.init({
projectId: 'your-project-id',
service: 'your-service-name',
version: '0.0.1',
});
Logger.getInstance().log({
stt: 'solutions',
context: 'main.ts',
functionName: 'bootstrap',
message: 'this is a log message...',
});
};
}
bootstrap();
import { createMiddleware } from "logging-chiper";
import express, { Request, Response } from "express";
import { AddressInfo } from "net";
import { LoggingWinston } from "@google-cloud/logging-winston";
import { transports } from "winston";
const app = express();
createMiddleware([
// creates the middleware
new transports.Console(), // logs to console
new LoggingWinston({
// logs to gpc
projectId: "chiper-development",
logName: "myapp",
}),
]).then((mw) => {
app.use(mw); // setup middler into express
app.get("/info", (req: Request, res: Response) => {
(req as any).log.info("get Hello World!"); // Using log from request
res.status(200).send("Hello World!");
});
const server = app.listen(3000, () => {
const address = server.address() as AddressInfo;
mw.logger.info(`running at http://${address.address}:${address.port}`); // use the logger from mw.
});
});
app.logmiddleware.ts
import { Injectable, NestMiddleware } from "@nestjs/common";
import { Request, Response, NextFunction } from "express";
import { createMiddleware } from "logging-chiper";
import { LoggingWinston } from "@google-cloud/logging-winston";
import { transports } from "winston";
@Injectable()
export class LoggerMiddleware implements NestMiddleware {
async use(req: Request, res: Response, next: NextFunction) {
const mw = await createMiddleware([
// creates the middleware
new transports.Console(), // logs to console
new LoggingWinston({
// logs to gpc
projectId: "chiper-development",
logName: "myapp",
}),
]);
mw(req, res, next);
}
}
app.module.ts
import { MiddlewareConsumer, Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { LoggerMiddleware } from "./app.loggermiddleware";
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer.apply(LoggerMiddleware).forRoutes("*");
}
}
The LoggingProvider
class provides a more structured and configurable way to handle logging with predefined context and logging levels. This is particularly useful when you want to create multiple logger instances for different parts of your application with specific configurations.
The LoggingProvider class was created to:
Logger.init()
before using LoggingProviderimport { LoggingProvider, Logger } from "logging-chiper";
// Initialize the base logger first
Logger.init({
projectId: "your-project-id",
service: "your-service-name",
version: "0.0.1",
});
// Create a LoggingProvider instance
const provider = new LoggingProvider(
{
stt: "my-service-team", // Required: service team name
levels: LoggingProvider.FULL, // Optional: logging levels (defaults to NONE)
},
{
context: "MyClass", // Optional: context name (defaults to 'LoggingProvider')
levels: LoggingProvider.LOG | LoggingProvider.ERROR, // Optional: override levels
}
);
The LoggingProvider supports different logging levels that can be combined:
// Available logging levels
LoggingProvider.NONE; // 0 - No logging
LoggingProvider.LOG; // 4 - Info level logging
LoggingProvider.WARN; // 2 - Warning level logging
LoggingProvider.ERROR; // 1 - Error level logging
LoggingProvider.FULL; // 7 - All levels (LOG | WARN | ERROR)
// Log info messages
provider.log({
functionName: "processData",
message: "Processing user data",
data: { userId: 123, action: "update" },
});
// Log warnings
provider.warn({
functionName: "validateInput",
message: "Invalid input received",
data: { input: "invalid-value" },
});
// Log errors
provider.error({
functionName: "saveData",
message: "Failed to save data to database",
error: new Error("Connection timeout"),
data: { recordId: 456 },
});
import { LoggingProvider, Logger } from "logging-chiper";
class UserService {
private logger: LoggingProvider;
constructor() {
// Create a LoggingProvider for this service
this.logger = new LoggingProvider(
{
stt: "user-management",
levels: LoggingProvider.FULL,
},
{
context: "UserService",
}
);
}
async createUser(userData: any) {
const functionName = this.createUser.name;
this.logger.log({
functionName,
message: "Starting user creation process",
data: { email: userData.email },
});
try {
// User creation logic here
const user = await this.saveUser(userData);
this.logger.log({
functionName,
message: "User created successfully",
data: { userId: user.id },
});
return user;
} catch (error) {
this.logger.error({
functionName,
message: "Failed to create user",
error,
data: { email: userData.email },
});
throw error;
}
}
private async saveUser(userData: any) {
// Implementation here
}
}
import { LoggingProvider, Logger } from "logging-chiper";
// Initialize base logger
Logger.init({
projectId: "my-project",
service: "api-gateway",
version: "1.0.0",
});
// Create providers for different components
const apiLogger = new LoggingProvider(
{ stt: "api-team", levels: LoggingProvider.FULL },
{ context: "ApiController" }
);
const dbLogger = new LoggingProvider(
{
stt: "database-team",
levels: LoggingProvider.ERROR | LoggingProvider.WARN,
},
{ context: "DatabaseService" }
);
const cacheLogger = new LoggingProvider(
{ stt: "infrastructure-team", levels: LoggingProvider.LOG },
{ context: "CacheService" }
);
// Usage in different parts of your application
apiLogger.log({
functionName: "handleRequest",
message: "Processing API request",
data: { endpoint: "/users", method: "GET" },
});
dbLogger.warn({
functionName: "connect",
message: "Database connection slow",
data: { responseTime: 5000 },
});
cacheLogger.log({
functionName: "get",
message: "Cache hit",
data: { key: "user:123" },
});
import { LoggingProvider, Logger } from "logging-chiper";
class PaymentProcessor {
private logger: LoggingProvider;
constructor(enableDebugLogging: boolean = false) {
// Enable different logging levels based on configuration
const levels = enableDebugLogging
? LoggingProvider.FULL
: LoggingProvider.ERROR | LoggingProvider.WARN;
this.logger = new LoggingProvider(
{ stt: "payments", levels },
{ context: "PaymentProcessor" }
);
}
async processPayment(paymentData: any) {
const functionName = this.processPayment.name;
// This will only log if LOG level is enabled
this.logger.log({
functionName,
message: "Payment processing started",
data: { amount: paymentData.amount, currency: paymentData.currency },
});
try {
// Payment processing logic
const result = await this.chargeCard(paymentData);
// This will only log if LOG level is enabled
this.logger.log({
functionName,
message: "Payment processed successfully",
data: { transactionId: result.id },
});
return result;
} catch (error) {
// This will always log if ERROR level is enabled
this.logger.error({
functionName,
message: "Payment processing failed",
error,
data: { amount: paymentData.amount },
});
throw error;
}
}
private async chargeCard(paymentData: any) {
// Implementation here
}
}
FAQs
just a little module to log
The npm package @chiper-inc/logging-chiper receives a total of 166 weekly downloads. As such, @chiper-inc/logging-chiper popularity was classified as not popular.
We found that @chiper-inc/logging-chiper demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Socket uncovers malicious Rust crates impersonating fast_log to steal Solana and Ethereum wallet keys from source code.
Research
A malicious package uses a QR code as steganography in an innovative technique.
Research
/Security News
Socket identified 80 fake candidates targeting engineering roles, including suspected North Korean operators, exposing the new reality of hiring as a security function.