mongodb 写日志。

1.写日志任务

package com.kenick.util;

import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

import java.util.ArrayList;
import java.util.List;

public class MongoWriteLogRunnable implements Runnable {

    @Override
    public void run() {
        // 写日志任务
        MongoDatabase databaseConn = getMongoDatabaseConn();
        writeLog(databaseConn);
    }

    private String username;
    private String pwd;
    private String msg;
    private String dbName;
    private static MongoDatabase mongoDatabase;

    public MongoWriteLogRunnable(String username, String pwd, String dbName, String msg){
        this.username = username;
        this.pwd = pwd;
        this.dbName = dbName;
        this.msg = msg;
    }

    // 获取mongodb数据库连接 注意多线程环境
    private MongoDatabase getMongoDatabaseConn(){
        if(mongoDatabase == null){
            synchronized (MongoWriteLogRunnable.class){
                if(mongoDatabase == null){
                    ServerAddress serverAddress = new ServerAddress("localhost", 27017);
                    List<ServerAddress> serverList = new ArrayList<>();
                    serverList.add(serverAddress);

                    MongoCredential credential = MongoCredential.createCredential(username, "admin", pwd.toCharArray());
                    ArrayList<MongoCredential> mongoCredentialList = new ArrayList<>();
                    mongoCredentialList.add(credential);

                    MongoClient mongoClient = new MongoClient(serverList, mongoCredentialList);
                    mongoDatabase = mongoClient.getDatabase(dbName);
                }
            }
        }
        return mongoDatabase;
    }

    // 往mongodb中写入日志
    private void writeLog(MongoDatabase mongoDatabase){
        try {
            MongoCollection<Document> testLogCollection = mongoDatabase.getCollection("testLog");
            testLogCollection.insertOne(new Document("msg",msg));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.写日志工具类

package com.kenick.util;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class MongoLogUtil {
    private static ExecutorService executorService = new ThreadPoolExecutor(0,50,
            60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());

    // 使用线程池,避免频繁创建线程,关闭线程,浪费资源
    public static void writeLog(String username,String pwd,String dbName,String msg){
        try {
            MongoWriteLogRunnable mongoWriteLogRunnable = new MongoWriteLogRunnable(username, pwd, dbName, msg);
            executorService.execute(mongoWriteLogRunnable);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 测试
    public static void main(String[] args) {
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                String threadName = Thread.currentThread().getName()+"_"+System.currentTimeMillis();
                for(int i=0;i<10;i++){
                    MongoLogUtil.writeLog("kenick", "kenick.com","tutorial",threadName);
                }
            }
        },"writeLogThread1");

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                String threadName = Thread.currentThread().getName()+"_"+System.currentTimeMillis();
                for(int i=0;i<10;i++){
                    MongoLogUtil.writeLog("kenick", "kenick.com", "tutorial", threadName);
                }
            }
        },"writeLogThread2");

        thread1.start();
        thread2.start();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenick

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值