• Unity接入腾讯云


    目录

    一、对象存储(COS)

    1.创建存储桶

     2.下载并使用SDK

    (1)异步上传(视频)

    (2)同步上传(图片)

    二、日志上报(CLS)

    1.创建日志主题

    2.使用第三方工具上传日志

    (1)使用 Winlogbeat 采集 Windows 事件日志上传 CLS

    (2)使用 Filebeat 采集 Windows 文件日志


    一、对象存储(COS)

    1.创建存储桶

            首先需要在存储桶列表页面创建存储桶,需要注意的是所属地域(我选的北京)及访问权限的设置(该项之后可更改),比如我用对象存储是为了保存图片和视频,那么我需要通过图片或视频上传腾讯云后的路径直接来预览或者下载文件,那么此时“私有读写”就满足不了该需求。

            (创建存储桶的操作也可通过代码实现)

            创建完的存储桶列表:

     2.下载并使用SDK

            在https://console.cloud.tencent.com/cos/sdk页面下载所需要的sdk(我用的Unity,所以使用的是.NET SDK)。

            将COSXMLDemo及QCloudCSharpSDK文件夹导入到Unity中(有报错的话删除COSXMLTests文件夹),COSXMLDemo/Program.cs功能很全面,考虑到上传视频可能会耗时,我使用的是异步的PutObject方法。

    (1)异步上传(视频)

            secretId及secretKey获取地址:访问密钥 - 控制台 (tencent.com)

            region根据自己所属地域设置。

    1. public void UploadVideoAsync()
    2. {
    3. PutObject();
    4. }
    5. internal static async Task PutObject()
    6. {
    7. string _bucket = "******";//修改项,存储桶名称
    8. string appid = "******";//修改项,设置腾讯云账户的账户标识 APPID,头像-账号信息中查看
    9. string key = "videos/test2.mp4";//修改项,对象在存储桶中的位置,即称对象键(个人理解为文件名称,要带后缀)
    10. string secretId = "******"; //修改项,云 API 密钥 SecretId
    11. string secretKey = "******"; //修改项,云 API 密钥 SecretKey
    12. string region = "ap-beijing";//修改项
    13. CosXmlConfig config = new CosXmlConfig.Builder()
    14. .SetConnectionTimeoutMs(60000) //设置连接超时时间,单位毫秒,默认45000ms
    15. .SetReadWriteTimeoutMs(40000) //设置读写超时时间,单位毫秒,默认45000ms
    16. .IsHttps(true) //设置默认 HTTPS 请求
    17. .SetAppid(appid)
    18. .SetRegion(region)
    19. .Build();
    20. long durationSecond = 600; //每次请求签名有效时长,单位为秒
    21. QCloudCredentialProvider qCloudCredentialProvider = new DefaultQCloudCredentialProvider(secretId,
    22. secretKey, durationSecond);
    23. CosXml cosXml = new CosXmlServer(config, qCloudCredentialProvider);
    24. //.cssg-snippet-body-start:[transfer-upload-file]
    25. // 初始化 TransferConfig
    26. TransferConfig transferConfig = new TransferConfig();
    27. // 初始化 TransferManager
    28. TransferManager transferManager = new TransferManager(cosXml, transferConfig);
    29. //对象在存储桶中的位置标识符,即称对象键
    30. String cosPath = key;
    31. //本地文件绝对路径
    32. String srcPath = @"D:\TALgit\UnityProgram\TengxunyunTest\Captures\videos.mp4";//本地文件绝对路径
    33. // 上传对象
    34. COSXMLUploadTask uploadTask = new COSXMLUploadTask(_bucket, cosPath);
    35. uploadTask.SetSrcPath(srcPath);
    36. uploadTask.progressCallback = delegate (long completed, long total)
    37. {
    38. Debug.Log(String.Format("progress = {0:##.##}%", completed * 100.0 / total));
    39. };
    40. try
    41. {
    42. COSXML.Transfer.COSXMLUploadTask.UploadTaskResult result = await
    43. transferManager.UploadAsync(uploadTask);
    44. Debug.Log(result.GetResultInfo());
    45. string eTag = result.eTag;
    46. }
    47. catch (Exception e)
    48. {
    49. Debug.Log("CosException: " + e);
    50. }
    51. return key;
    52. }

    (2)同步上传(图片)

    1. public string appid = "";//设置腾讯云账户的账户标识 APPID
    2. public string bucket = "";//存储桶,格式:BucketName-APPID
    3. public string key = "";//对象在存储桶中的位置,即称对象键(文件名称,要带后缀)
    4. public string secretId = ""; //云 API 密钥 SecretId
    5. public string secretKey = ""; //云 API 密钥 SecretKey
    6. public string region = "";
    7. public void UploadObject()
    8. {
    9. CosXmlConfig config = new CosXmlConfig.Builder()
    10. .SetConnectionTimeoutMs(60000) //设置连接超时时间,单位毫秒,默认45000ms
    11. .SetReadWriteTimeoutMs(40000) //设置读写超时时间,单位毫秒,默认45000ms
    12. .IsHttps(true) //设置默认 HTTPS 请求
    13. .SetAppid(appid)
    14. .SetRegion(region)
    15. .Build();
    16. long durationSecond = 600; //每次请求签名有效时长,单位为秒
    17. QCloudCredentialProvider qCloudCredentialProvider = new DefaultQCloudCredentialProvider(secretId,
    18. secretKey, durationSecond);
    19. CosXml cosXml = new CosXmlServer(config, qCloudCredentialProvider);
    20. try
    21. {
    22. string srcPath = @"C:\Users\meinv\Desktop\testPanda.png";//本地文件绝对路径
    23. if (!File.Exists(srcPath))
    24. {
    25. // 如果不存在目标文件,创建一个临时的测试文件
    26. //File.WriteAllBytes(srcPath, new byte[1024]);
    27. Debug.Log("文件不存在");
    28. return;
    29. }
    30. PutObjectRequest request = new PutObjectRequest(bucket, key, srcPath);
    31. //设置签名有效时长
    32. request.SetSign(TimeUtils.GetCurrentTime(TimeUnit.Seconds), 600);
    33. //设置进度回调
    34. request.SetCosProgressCallback(delegate (long completed, long total)
    35. {
    36. Debug.Log(String.Format("progress = {0:##.##}%", completed * 100.0 / total));
    37. });
    38. //执行请求
    39. PutObjectResult result = cosXml.PutObject(request);
    40. //对象的 eTag
    41. string eTag = result.eTag;
    42. Debug.Log(result.GetResultInfo() + "," + result.crc64ecma);
    43. //url地址
    44. Debug.Log("https://" + bucket + ".cos." + region + ".myqcloud.com/" + key);
    45. }
    46. catch (COSXML.CosException.CosClientException clientEx)
    47. {
    48. //请求失败
    49. Debug.Log("CosClientException: " + clientEx);
    50. }
    51. catch (COSXML.CosException.CosServerException serverEx)
    52. {
    53. //请求失败
    54. Debug.Log("CosServerException: " + serverEx.GetInfo());
    55. }
    56. }

    (3)获取文件在腾讯云的url

    "https://" + bucket + ".cos." + region + ".myqcloud.com/" + key

    二、日志上报(CLS)

            日志上报没有.Net的SDK,可通过API和第三方工具两种接入方式。本人尝试通过API接入鉴权一直不过,咨询官方人员,建议使用第三方工具。

    我先把API接入需要的文档列出来(可自行尝试):

    1.创建日志主题

            在日志主题 - 日志服务 - 控制台 (tencent.com)页面创建,没什么注意的。此时我们获得了日志主题ID和日志集ID。

    2.使用第三方工具上传日志

             官方文档在这里

    (1)使用 Winlogbeat 采集 Windows 事件日志上传 CLS

            先说结论:初步尝试后不提倡运用Winlogbeat,因为它基于事件日志上传,很多我不需要的数据也给我传了上去。

             首先我跟着官方文档安装了Winlogbeat,并且修改了winlogbeat.yml,但是我如何上传我需要的数据呢?这就需要使用 Kafka 协议上传日志,文档在这里.代码我也列一下,主要修改了数据上传测试那一部分。

    需要用到kafka插件:KafKaForUnity.unitypackage-其它文档类资源-CSDN文库

    1. void kafkaTest()
    2. {
    3. var config = new ProducerConfig
    4. {
    5. BootstrapServers = "bj-producer.cls.tencentcs.com:9096",//域名参考 https://cloud.tencent.com/document/product/614/18940#Kafka 填写,注意内网端口9095,公网端口9096
    6. SaslMechanism = SaslMechanism.Plain,
    7. SaslUsername = "***", // todo topic所属日志集ID
    8. SaslPassword = "***#***", // todo topic所属uin的密钥
    9. SecurityProtocol = SecurityProtocol.SaslPlaintext,
    10. Acks = Acks.None, // todo 根据实际使用场景赋值。可取值: Acks.None、Acks.Leader、Acks.All
    11. MessageMaxBytes = 5242880 // todo 请求消息的最大大小,最大不能超过5M
    12. };
    13. // deliveryHandler
    14. Actionstring, string>> handler =
    15. r => Debug.Log(!r.Error.IsError ? $"Delivered message to {r.TopicPartitionOffset}" : $"Delivery Error: {r.Error.Reason}");
    16. using (var produce = new ProducerBuilder<string, string>(config).Build())
    17. {
    18. try
    19. {
    20. // todo 测试验证代码
    21. for (var i = 0; i < 3; i++)
    22. {
    23. // todo 替换日志主题ID
    24. produce.Produce("***", new Message<string, string> { Key = "test", Value = "C# demo value" }, handler);
    25. }
    26. produce.Flush(TimeSpan.FromSeconds(10));
    27. }
    28. catch (ProduceException<string, string> pe)
    29. {
    30. Debug.Log($"send message receiver error : {pe.Error.Reason}");
    31. }
    32. }
    33. }

             but!传到腾讯云的结果没有key,只有value,而且我要上传的数据不止这一个,我希望以json的形式上传到腾讯云,但是尝试了一下并不行(也可能是我不行?但我不想承认)。

    (2)使用 Filebeat 采集 Windows 文件日志

            同志们!这个就yyds了!先上结果,红框中的就是我传的数据。

             具体操作还是跟着官方文档,下载好filebeat并安装,修改filebeat.yml,因为我是采集文件中的数据,所以我的filebeat.yml是这样写的(可根据自己的需求,参照filebeat.reference.yml文档实现):

    1. # ============================== Filebeat inputs ===============================
    2. filebeat.inputs:
    3. - type: log
    4. enabled: true
    5. paths:
    6. #- /var/log/*.log
    7. - C:/Users/fengchujun/Desktop/filebeatlog.log #TODO 日志文件路径
    8. encoding: utf-8
    9. json.keys_under_root: true
    10. # ================================== Outputs ===================================
    11. output.kafka:
    12. enabled: true
    13. hosts: ["bj-producer.cls.tencentcs.com:9096"] # TODO 服务地址;外网端口9096,内网端口9095
    14. topic: "***" # TODO topicID
    15. version: "0.11.0.2"
    16. compression: "lz4" # 配置压缩方式,支持gzip,snappy,lz4;例如"lz4"
    17. username: "***"
    18. password: "***#***"
    19. # ================================= Processors =================================
    20. processors:
    21. - decode_json_fields:
    22. fields: ["message"]
    23. process_array: false
    24. max_depth: 1
    25. target: "json"
    26. overwrite_keys: true

    注意:

    1.json.keys_under_root设置为true后,上传到腾讯云后才能让字段位于根节点。

    2.filebeat.yml编写或者修改时,注意字段是有父子层级的,所以有的字段前面要有空格。

    3.filebeatlog.log文件日志,以json形式上传时,每一个json字符串为一行之后要换行。

     unity往日志文件写json就好弄了:

    1. public class JsonObj {
    2. public string actionName;
    3. public string guid;
    4. public float score;
    5. public string version;
    6. }
    7. ///
    8. /// 上传腾讯云的日志
    9. ///
    10. ///
    11. public static void WriteIntoQCloudlog(string actionName, string guid, float score)
    12. {
    13. JsonObj jsonObj = new JsonObj();
    14. jsonObj.actionName = actionName;
    15. jsonObj.guid = guid;
    16. jsonObj.score = score;
    17. jsonObj.version = version;
    18. string message = JsonUtility.ToJson(jsonObj);
    19. StreamWriter writer;
    20. FileInfo file = new FileInfo(Application.dataPath + "/filebeatlog.log");
    21. if (!file.Exists)
    22. {
    23. writer = file.CreateText();
    24. }
    25. else
    26. {
    27. writer = file.AppendText();
    28. }
    29. writer.WriteLine(message);
    30. writer.Flush();
    31. writer.Dispose();
    32. writer.Close();
    33. }

            最后再说一个不明觉厉的点:安装好filebeat后,开机会自启动,自动上传日志,所以不用我们每次都手动在windowspowershell中启动服务了~

  • 相关阅读:
    Codeforces Round #836 (Div. 2) A.B.C.D
    Java中的文件操作
    git switch 命令详解
    Bootstrap的弹性盒子布局学习笔记
    异常处理(try,catch,finally)
    Python 实现个人博客系统(附零基础python学习资料)
    Git下载指定历史版本的代码(详细步骤)
    利用数学方法进行算法优化
    javaweb(servlet)+jsp+Mysql实现的简单相册管理系统(功能包含登录、管理首页、添加图片、分类管理、修改密码、图片详情等)
    基于Fuzzing和ChatGPT结合的AI自动化测试实践分享
  • 原文地址:https://blog.csdn.net/weixin_39766005/article/details/127071134