Java log code example

本文介绍如何在Java中使用日志记录、过滤、格式化及输出到XML文件和发送邮件的功能,包括日志过滤器、日志记录格式化、自定义日志输出样式以及通过邮件发送日志信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java log example

  1. Logrecord filter

import java.util.logging.Filter;

import java.util.logging.Level;

import java.util.logging.LogRecord;

import java.util.logging.Logger;

 

public class SimpleFilter {

 

  private static Logger logger = Logger.getLogger("SimpleFilter");

 

  static class Duck {

  };

 

  static class Wombat {

  };

 

  static void sendLogMessages() {

    logger.log(Level.WARNING, "Aduck in the house!", new Duck());

    logger.log(Level.WARNING, "A Wombat at large!", newWombat());

  }

 

  public static void main(String[] args) {

    sendLogMessages();

    logger.setFilter(newFilter() {

      public boolean isLoggable(LogRecord record){

        Object[] params = record.getParameters();

        if (params == null)

          return true; // No parameters

        if (record.getParameters()[0]instanceof Duck)

          return true; // Only log Ducks

        return false;

      }

    });

    logger.info("After setting filter..");

    sendLogMessages();

 

  }

}

Output:

Aug 28,2013 11:46:04 AM SimpleFilter sendLogMessages

WARNING:A duck in the house!

Aug 28,2013 11:46:04 AM SimpleFilter sendLogMessages

WARNING:A Wombat at large!

Aug 28,2013 11:46:04 AM SimpleFilter main

INFO:After setting filter..

Aug 28,2013 11:46:04 AM SimpleFilter sendLogMessages

WARNING:A duck in the house!

注:重写isLoggable方法可以对logrecord对象进行过滤。

2. Simple for Formatter Example

import java.util.logging.ConsoleHandler;

import java.util.logging.Formatter;

import java.util.logging.Handler;

import java.util.logging.LogRecord;

import java.util.logging.Logger;

 

public class SimpleFormatterExample {

 

  private static Logger logger = Logger.getLogger("SimpleFormatterExample");

 

  private static void logMessages() {

    logger.info("Line One");

    logger.info("Line Two");

  }

 

  public static void main(String[] args) {

    logger.setUseParentHandlers(false);

    Handler conHdlr = new ConsoleHandler();

    conHdlr.setFormatter(new Formatter() {

      public String format(LogRecord record) {

        return record.getLevel() + "  : "

            + record.getSourceClassName() + " -:- "

            + record.getSourceMethodName() + " -:- "

            + record.getMessage() + "\n";

      }

    });

    logger.addHandler(conHdlr);

    logMessages();

 

  }

}

Output:

INFO  : SimpleFormatterExample -:- logMessages -:- Line One

INFO  : SimpleFormatterExample -:- logMessages -:- Line Two

注:可以对输出的log格式进行特定格式化。

3. Format log output by overriding tostring()function,

import java.util.logging.Level;

import java.util.logging.LogRecord;

 

public class PrintableLogRecord extends LogRecord {

 

  public PrintableLogRecord(Level level, String str) {

    super(level, str);

  }

 

  public StringtoString() {

    String result = "Level<" + getLevel() + ">\n" + "LoggerName<"

        + getLoggerName() + ">\n" + "Message<" + getMessage() + ">\n"

        + "CurrentMillis<" + getMillis() + ">\n" + "Params";

    Object[] objParams = getParameters();

    if (objParams == null)

      result += "<null>\n";

    else

      for (int i =0; i < objParams.length; i++)

        result += "  Param # <" + i + " value "

            + objParams[i].toString() + ">\n";

    result += "ResourceBundle<" + getResourceBundle()

        + ">\nResourceBundleName<" + getResourceBundleName()

        + ">\nSequenceNumber<" + getSequenceNumber()

        + ">\nSourceClassName<" + getSourceClassName()

        + ">\nSourceMethodName<" + getSourceMethodName()

        + ">\nThreadId<" + getThreadID() + ">\nThrown<" +getThrown()

        + ">";

    return result;

  }

 

  public static void main(String[] args) {

    PrintableLogRecord logRecord = new PrintableLogRecord(Level.FINEST,

        "SimpleLog Record");

    System.out.println(logRecord);

  }

}

Output:

Level<FINEST>

LoggerName<null>

Message<SimpleLog Record>

CurrentMillis<1377662640451>

Params<null>

ResourceBundle<null>

ResourceBundleName<null>

SequenceNumber<0>

SourceClassName<null>

SourceMethodName<null>

ThreadId<10>

Thrown<null>

 

4.  email log

import java.util.logging.*;
import java.io.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class EmailLogger {
  private static Logger logger = Logger.getLogger("EmailLogger");
  public static void main(String[] args) throws Exception {
    logger.setUseParentHandlers(false);
    Handler conHdlr = new ConsoleHandler();
    conHdlr.setFormatter(new Formatter() {
      public String format(LogRecord record) {
        return record.getLevel() + "  :  "
          + record.getSourceClassName() + ":"
          + record.getSourceMethodName() + ":"
          + record.getMessage() + "\n";
      }
    });
    logger.addHandler(conHdlr);
    logger.addHandler(
      new FileHandler("EmailLoggerOutput.xml"));
    logger.addHandler(new MailingHandler());
    logger.log(Level.INFO,
      "Testing Multiple Handlers""SendMailTrue");
  }
}

// A handler that sends mail messages
class MailingHandler extends Handler {
  public void publish(LogRecord record) {
    Object[] params = record.getParameters();
    if(params == nullreturn;
    // Send mail only if the parameter is true
    if(params[0].equals("SendMailTrue")) {
      new MailInfo("bruce@theunixman.com",
        new String[] { "bruce@theunixman.com" },
        "smtp.theunixman.com""Test Subject",
        "Test Content").sendMail();
    }
  }
  public void close() {}
  public void flush() {}
}

class MailInfo {
  private String fromAddr;
  private String[] toAddr;
  private String serverAddr;
  private String subject;
  private String message;
  public MailInfo(String from, String[] to,
    String server, String subject, String message) {
    fromAddr = from;
    toAddr = to;
    serverAddr = server;
    this.subject = subject;
    this.message = message;
  }
  public void sendMail() {
    try {
      Properties prop = new Properties();
      prop.put("mail.smtp.host", serverAddr);
      Session session =
        Session.getDefaultInstance(prop, null);
      session.setDebug(true);
      // Create a message
      Message mimeMsg = new MimeMessage(session);
      // Set the from and to address
      Address addressFrom = new InternetAddress(fromAddr);
      mimeMsg.setFrom(addressFrom);
      Address[] to = new InternetAddress[toAddr.length];
      for(int i = 0; i < toAddr.length; i++)
        to[i] = new InternetAddress(toAddr[i]);
      mimeMsg.setRecipients(Message.RecipientType.TO,to);
      mimeMsg.setSubject(subject);
      mimeMsg.setText(message);
      Transport.send(mimeMsg);
    catch (Exception e) {
      throw new RuntimeException(e);
    }
  }
}

<think>我们正在处理用户关于PayDollar支付网关在PHP中集成的请求。用户需要教程或代码示例。 根据之前的引用,我们有一些关于PayDollar集成的信息,特别是引用[2]中提到了一个开发指南的PDF链接和一个GitHub示例(虽然是用Java/Springboot实现的),但用户需要的是PHP的示例。 由于引用中没有直接提供PHP的示例,我们需要根据一般经验来构建一个PHP集成示例。通常,支付网关集成涉及以下步骤: 1. 在PayDollar商家后台注册并获取商户ID和密钥。 2. 创建支付表单,包括必要的参数(如商户ID、订单号、金额、币种等)并生成签名。 3. 将表单提交到PayDollar的支付页面。 4. 处理支付结果回调(包括服务器到服务器通知和浏览器重定向)。 我们将提供一个简单的PHP代码示例,展示如何构建支付请求并生成签名,以及如何处理回调。 注意:由于PayDollar的具体参数和签名方式可能随时间变化,请务必参考官方最新的集成文档(引用[2]中提供的链接:https://www.paydollar.com.cn/pdf/paygate-merchant-api-integration-guide-1-3.pdf)。 步骤1:构建支付请求并生成签名 步骤2:创建提交到PayDollar的HTML表单 步骤3:处理支付结果回调(这里只提供回调验证签名的示例) 由于我们无法获取用户的具体商户信息,以下示例将使用占位符。 另外,关于签名生成,根据文档,通常使用SHA256算法,将参数按字母顺序排序,然后拼接成字符串,再加上密钥,最后计算哈希。 开始编写代码示例:</think>### PayDollar支付网关PHP集成指南 以下是PayDollar支付网关在PHP中的基础集成步骤和代码示例: #### 1. 准备工作 - 在PayDollar注册商户账户并获取商户ID(`merchantId`)和密钥(`secretKey`) - 确定支付环境:测试环境(`https://test.paydollar.com/gateway`)或生产环境(`https://www.paydollar.com/gateway`) #### 2. 创建支付请求 ```php <?php // 配置参数 $merchantId = 'YOUR_MERCHANT_ID'; $secretKey = 'YOUR_SECRET_KEY'; $paydollarUrl = 'https://test.paydollar.com/gateway'; // 订单参数 $orderData = [ 'merchantId' => $merchantId, 'orderRef' => 'ORD'.time(), // 唯一订单号 'currCode' => '344', // 货币代码(344=HKD) 'amount' => '100.00', // 订单金额 'payType' => 'N', // N=普通支付 'lang' => 'E', // 语言(E=英文) 'successUrl' => 'https://yoursite.com/success.php', 'failUrl' => 'https://yoursite.com/fail.php', 'cancelUrl' => 'https://yoursite.com/cancel.php', 'notifyUrl' => 'https://yoursite.com/notify.php' ]; // 生成签名 ksort($orderData); // 按键名排序 $signString = implode('|', array_map(function ($v) { return str_replace('|', '%7C', $v); // 转义管道符 }, array_values($orderData))); $signature = hash_hmac('sha256', $signString, $secretKey); $orderData['signature'] = $signature; ?> ``` #### 3. 提交支付表单 ```html <form method="post" action="<?= $paydollarUrl ?>"> <?php foreach ($orderData as $name => $value): ?> <input type="hidden" name="<?= $name ?>" value="<?= htmlspecialchars($value) ?>"> <?php endforeach; ?> <button type="submit">Pay Now</button> </form> ``` #### 4. 处理支付回调(notify.php) ```php <?php // 获取回调数据 $response = $_POST; // 验证签名 $originalSignature = $response['signature']; unset($response['signature']); ksort($response); $checkString = implode('|', array_map(function ($v) { return str_replace('|', '%7C', $v); }, array_values($response))); $computedSignature = hash_hmac('sha256', $checkString, $secretKey); if (hash_equals($computedSignature, $originalSignature)) { // 签名验证成功 $orderRef = $response['orderRef']; $payResult = $response['successcode']; // 0=成功 if ($payResult === '0') { // 支付成功逻辑 file_put_contents("logs/$orderRef.log", json_encode($response)); echo "OK"; } else { // 支付失败处理 error_log("Payment failed for order $orderRef: ".$response['errMsg']); } } else { // 签名验证失败 header('HTTP/1.1 400 Bad Request'); exit('Invalid signature'); } ?> ``` #### 5. 注意事项 1. **安全措施**: - 始终在服务器端验证签名 - 使用`hash_equals()`防止时序攻击 - 记录所有交易日志 2. **参数要求**: - 金额格式:`100.00`(保留两位小数) - 货币代码:HKD=`344`,CNY=`156`,USD=`840` - 订单号需唯一且不可预测 3. **测试建议**: - 使用测试环境参数: ```php $merchantId = 'TEST000000000001'; $secretKey = 'TESTTEST'; ``` 详细参数说明请参考官方文档[^1][^2] --- ### 相关问题 1. PayDollar支付网关支持哪些支付方式? 2. 如何处理PayDollar的支付结果回调验证? 3. PayDollar集成中常见的错误代码有哪些? 4. 如何在PayDollar中设置自定义支付页面样式? 5. PayDollar的退款流程如何通过API实现? [^1]: PayDollar商户集成指南: https://www.paydollar.com/pdf/paygate-merchant-api-integration-guide.pdf [^2]: Visa开发者中心: https://developer.visa.com/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值