XTLS / libXray

MIT License
64 stars 57 forks source link

请教转发 xray log 至 native 的功能问题提问? #15

Closed ghostwolf90 closed 8 months ago

ghostwolf90 commented 8 months ago

接续问题 #14 请问我后来在 xray_wrapper.go 新增增加转发 xray log 至 native 的功能,但是在 系统监控程式.app 看到的 log 是 "private" 并无转发到 native 中,所以提出以下 xray_wrapper.go 新增的内容,能请问各位前辈,我的程式码是否有没注意到的问题吗?

目前遇到两个问题

  1. log 内容是 "< private >"。
  2. OnAccessLog 没有转发到 native;设计上是希望向 delegate 传到 native。

private log image

/// XrayLogger
type XrayLogger interface {
    OnAccessLog(message string)
}

type myLogger struct{}

func (m *myLogger) OnAccessLog(message string) {
    fmt.Println("Access Log:", message)
}

var globalLogger XrayLogger

// XraySetupLogger 接收一个 XrayLogger 接口实现
func XraySetupLogger(logger XrayLogger) {
    globalLogger = logger
    if logger != nil {
        logger.OnAccessLog("Access log message")
    }
}

/// Give me Log

type consoleLogWriter struct {
    logger *log.Logger
}

func (w *consoleLogWriter) Close() error {
    return nil
}

func (w *consoleLogWriter) Write(s string) error {
    w.logger.Println(s)
    globalLogger.OnAccessLog(s)
    var stringA = fmt.Sprintf("(String(reflecting: %v), privacy: .public)", s)
    globalLogger.OnAccessLog(stringA)
    return nil
}

type defaultLogWriter struct{}

func (defaultLogWriter) Write(b []byte) (int, error) {
    log.Println("(String(reflecting: %v), privacy: .public)", string(b))
    var stringA = fmt.Sprintf("(String(reflecting: %v), privacy: .public)", string(b))
    globalLogger.OnAccessLog(stringA)
    return len(b), nil
}

func CreateDefaultLogWriter() v2commlog.WriterCreator {
    return func() v2commlog.Writer {
        return &consoleLogWriter{
            logger: log.New(defaultLogWriter{}, "", 0),
        }
    }
}

func init() {
    v2applog.RegisterHandlerCreator(v2applog.LogType_Console, func(lt v2applog.LogType, options v2applog.HandlerCreatorOptions) (v2commlog.Handler, error) {
        return v2commlog.NewLogger(CreateDefaultLogWriter()), nil
    })
}

以下是Swift的實現接口部分

extension XRayCoreManager: LibXrayXrayLoggerProtocol {

    func onAccessLog(_ message: String?) {
        os_log("[DEBUGV] onAccessLog: %{public}@", log: OSLog.default, type: .info, message ?? "456")

    }
}
yiguous commented 8 months ago

两个问题:

  1. 转发至 native 是让你用对应的 swift / kotlin 去实现日志的 输出
  2. Logger.xxxx("(String(reflecting: msg), privacy: .public)") 是 swift 的具体实现。

看来你是一点没 google 啊。

这个问题不会再有后续解答,请自行 google 。

ghostwolf90 commented 8 months ago

感谢回答,我大部分是用GPT-4在提问,看来我没有get到问题的重点 我确实在转发的部分遇到比较多问题,因为想要效仿 Mango 专案输出log那样

定义一个 OnAccessLog(message string) 方法,在 swift 继承 LibXrayXrayLoggerProtocol 透过 delegate 到 native 过来收到 log。

ghostwolf90 commented 8 months ago

@yiguous 不好意思,打擾你,已經嘗試閱讀別人分享範例和GPT-4的詢問,只有進步一點點,但還是沒有成果,請問如果付費的話,能夠請你給我指導範例嗎?

yiguous commented 8 months ago

https://github.com/XTLS/libXray/issues/14#issuecomment-1844082795

这里已经提供了两种方案,如果第一种缺乏实现的能力,为什么不试试第二种呢?

ghostwolf90 commented 8 months ago

兩種都有嘗試過,但是都沒有成功,可能自己理解力不足;會偏向第一種是因為之前使用 Arror大大寫的 mango,使用上再檢查log很好用,所以想要向他一樣,雖然後續他也消失了... 呈現log功能已經嘗試好幾個星期沒有突破,所以才在有關Xray的地方尋求幫助指點 感謝你的閱讀

ghostwolf90 commented 8 months ago

@yiguous 跟你說好消息,目前寫入log已經成功了,最後的解決方案是app指定寫入的路徑給go,go會在那個路徑產生檔案,最後從 app 那端其取出來看log,終於大功告成,感謝囉 後續更新,已經有辦法實現第一項 转发至 native 让 swift 实现日志的输出囉

yiguous commented 8 months ago

Good job!